From 5206d57f6502e40180674964061248abdd78e764 Mon Sep 17 00:00:00 2001 From: lepshiy Date: Thu, 11 Sep 2025 09:19:24 +0300 Subject: [PATCH 01/12] =?UTF-8?q?=D1=82=D1=80=D0=B0=D1=81=D1=81=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scripts/trassa.gd | 84 +++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 78 insertions(+), 6 deletions(-) diff --git a/scripts/trassa.gd b/scripts/trassa.gd index 164afa3e..d623a480 100644 --- a/scripts/trassa.gd +++ b/scripts/trassa.gd @@ -1,12 +1,84 @@ class_name trassa_unit extends Node +const ONLINE_TIMEOUT: int = 5000 ## Время ожидания данных +const REQUEST_PERIOD: int = 3000 ## Переиод запроса, мс class Trassa extends unit.Unit: - func process(tick: int): - return Error.ERR_BUSY + + enum CmdCode { + START = 1, + STOP = 0, + INFO = 4, + } - func _init(unit_name: StringName): - self.name = unit_name - func parse(data: PackedByteArray, now_tick: int): - pass + func sciCalcFCS(src: PackedByteArray) -> int: + var fcs: int = 0 + for b in src: + fcs ^= b + print("FCS: ", fcs) + return fcs & 0xFF + + + func _init(nm: StringName) -> void: + self.name = nm + tx_data.resize(10) + tx_data[0] = 0 #ID + tx_data[1] = 0 #Nc + tx_data[2] = 0 #RKS + tx_data[3] = 0 #RR + tx_data[4] = 0 #Td + tx_data[5] = 0 #Nt + tx_data[6] = 0 #Пакет от uarep-ctl + tx_data[7] = CmdCode.INFO #SRN + tx_data[8] = CmdCode.INFO #JTIDS + tx_data[9] = 0 #CRC + print("INIT: ", self.name) + + + func parse(rx_data: PackedByteArray, tick: int): + print("PARSE: ", tick, "size:", rx_data.size()) + if rx_data.size() != 40: + print("PARSE: ") + emit_signal("parse_failed", self) + return + var expected_fcs = sciCalcFCS(rx_data.slice(0, 39)) + if expected_fcs != rx_data[39]: + print("PARSE: ", expected_fcs, "Got:", rx_data[39]) + emit_signal("parse_failed", self) + return + var strings := [] + for i in range(10): + var offset = i * 4 + var line = rx_data.slice(offset, offset + 4) + print("PARSE: ", i, ":", line) + strings.append(line) + print("PARSE: ") + emit_signal("data_received", strings) + + + func process(tick: int) -> int: + var rc: = Error.ERR_BUSY + if (tick - tx_tick) > REQUEST_PERIOD: + tx_tick = tick + rc = Error.OK + print("PROCESS: ", tick) + if online: + if (tick - rx_tick) > ONLINE_TIMEOUT: + online = false + emit_signal('line_changed', self) + return rc + + + func build_packet() -> PackedByteArray: + var packet := PackedByteArray() + packet.resize(40) + for i in range(10): + var offset = i * 4 + packet[offset + 0] = i + packet[offset + 1] = i + 1 + packet[offset + 2] = i + 2 + packet[offset + 3] = i + 3 + packet[39] = sciCalcFCS(packet.slice(0, 39)) + print("BUILD: ", packet) + return packet From 9a04666fdcbcd90ca984287e688b0b7914e620d6 Mon Sep 17 00:00:00 2001 From: MaD_CaT Date: Tue, 23 Sep 2025 14:38:35 +0300 Subject: [PATCH 02/12] Godot4 --- scenes/работа/работа.tscn | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scenes/работа/работа.tscn b/scenes/работа/работа.tscn index 64b1bbd5..6d645182 100644 --- a/scenes/работа/работа.tscn +++ b/scenes/работа/работа.tscn @@ -305,6 +305,6 @@ text = "Масштаб:" [connection signal="drag_continue" from="." to="." method="_on_drag_continue"] [connection signal="toggled" from="btn_view" to="." method="on_button_view_toggled"] [connection signal="toggled" from="chk_auto" to="." method="on_value_changed"] -[connection signal="toggled" from="btn_activate" to="." method="on_btn_activate_toggled"] [connection signal="toggled" from="btn_activate" to="." method="on_btn_activate"] +[connection signal="toggled" from="btn_activate" to="." method="on_btn_activate_toggled"] [connection signal="toggled" from="btn_center" to="." method="on_btn_center_toggled"] From 98c8ea8b21c3bfe13e9fc3266be79b02aaf884a4 Mon Sep 17 00:00:00 2001 From: MaD_CaT Date: Wed, 24 Sep 2025 13:20:20 +0300 Subject: [PATCH 03/12] =?UTF-8?q?=D0=94=D0=BE=D1=80=D0=B0=D0=B1=D0=BE?= =?UTF-8?q?=D1=82=D0=BA=D0=B0.=20=D0=92=D0=BA=D0=BB=D1=8E=D1=87=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D1=80=D0=B5=D0=BA=D0=BE=D0=BC=D0=B5=D0=BD?= =?UTF-8?q?=D0=B4=D0=BE=D0=B2=D0=B0=D0=BD=D0=BD=D0=BE=D0=B9=20=D0=B4=D0=BB?= =?UTF-8?q?=D1=8F=20=D1=86=D0=B5=D0=BB=D0=B8=20=D0=BF=D0=BE=D0=BC=D0=B5?= =?UTF-8?q?=D1=85=D0=B8.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scripts/interfer.gd | 59 ++++++++++++++++++++++++++++++++++++++++++--- scripts/threats.gd | 2 +- 2 files changed, 57 insertions(+), 4 deletions(-) diff --git a/scripts/interfer.gd b/scripts/interfer.gd index b7d68810..70b69c32 100644 --- a/scripts/interfer.gd +++ b/scripts/interfer.gd @@ -20,6 +20,11 @@ const ITERFER_MODE = { 'k1': [INTERFER_IQFILE, K1_PARAMS, 50], 'ozp1': [INTERFER_IQFILE, OZP1_PARAMS, 51] } +const RECOMMEND_INTERFER = { + 'ПСП + ФМ-2': 'srni1', + 'Линейная ЧМ': 'lchm1' +} + const SRNI1_PARAMS = {'par_names' : ['freq', 'width']} const SRNM2_PARAMS = {'par_names' : ['freq', 'width', 'period']} const SRNGPS_PARAMS = {'par_names' : ['freq', 'filename'], @@ -265,17 +270,23 @@ func on_data_capsrpb_received(unit0: capsrpb.CapsRpb, ecms: Dictionary) -> void: ## Вызыватся, когда пользователь выбрал помеху и выбраны цели. func on_interfer_create(interfer_name, sel_threats, fs_arr, power, u, ecms) -> void: + var ecm_name = interfer_name for item in sel_threats: var param: Dictionary = {} var kni: float = item.aoa var id = item.id param['freq'] = item.freq param['width'] = item.width + if item.rkrp != '': + var krp = get_krp(item) + if krp != '': + ecm_name = krp + set_rparams(item, param) if (param['width'] < settings.WIDTH_MIN): param['width'] = settings.WIDTH_MIN elif (param['width'] > settings.WIDTH_MAX): param['width'] = settings.WIDTH_MAX - interfer_create(u, interfer_name, ecms, param, kni, id, thrs, SOURCE_INTERFER[0], power) + interfer_create(u, ecm_name, ecms, param, kni, id, thrs, SOURCE_INTERFER[0], power) for item in fs_arr: var param: Dictionary = {} @@ -287,6 +298,11 @@ func on_interfer_create(interfer_name, sel_threats, fs_arr, power, u, ecms) -> v if th != null: param['freq'] = th.freq param['width'] = th.width + if th.rkrp != '': + var krp = get_krp(th) + if krp != '': + ecm_name = krp + set_rparams(th, param) else: param['freq'] = item[1] param['width'] = item[2] @@ -295,10 +311,10 @@ func on_interfer_create(interfer_name, sel_threats, fs_arr, power, u, ecms) -> v elif (param['width'] > settings.WIDTH_MAX): param['width'] = settings.WIDTH_MAX if th == null: - interfer_create(u, interfer_name, ecms, param, kni, id, fs, SOURCE_INTERFER[1], power) + interfer_create(u, ecm_name, ecms, param, kni, id, fs, SOURCE_INTERFER[1], power) else: id = th.id - interfer_create(u, interfer_name, ecms, param, kni, id, thrs, SOURCE_INTERFER[0], power) + interfer_create(u, ecm_name, ecms, param, kni, id, thrs, SOURCE_INTERFER[0], power) func on_interfer_rcv(interfer_params: Array, unit0, ecms) -> void: var err: bool = false @@ -470,6 +486,12 @@ func on_threats_update(threat, ecms, unit_caps): if thrs[ecm_i] == th_id: ecm = ecms[ecm_i] ecm.params['freq'] = threat.freq + ecm.params['width'] = threat.width + if threat.rkrp != '': + var krp = get_krp(threat) + if krp != '': + ecm.krp = krp + set_rparams(threat, ecm.params) ecm.kni = threat.aoa set_nmfs(ecm) if threat.tmod != 'fm': @@ -538,3 +560,34 @@ func find_threat(freq: int, aoa: float): if fs_index_arr[0] == fs_index: return th return null + + +func set_rparams(threat: threats.Threat, params: Dictionary): + if threat.rparams.has('freq'): + params['freq'] = threat.rparams['freq'] + else: + params['freq'] = threat.freq + if threat.rparams.has('period'): + params['period'] = threat.rparams['period'] + if threat.rparams.has('width'): + params['width'] = threat.rparams['width'] + else: + params['width'] = threat.width + if threat.rparams.has('filename'): + params['filename'] = threat.rparams['filename'] + + +func get_krp(threat: threats.Threat): + var krp = '' + if RECOMMEND_INTERFER.has(threat.rkrp): + krp = RECOMMEND_INTERFER[threat.rkrp] + return krp + elif threat.rkrp == INTERFER_IQFILE: + if not threat.rparams.has('filename'): return krp + for key in ITERFER_MODE.keys(): + var ecm_params = ITERFER_MODE[key][1] + if not ecm_params.has('files'): continue + if ecm_params['files'] == threat.rparams['filename']: + krp = key + return krp + return krp diff --git a/scripts/threats.gd b/scripts/threats.gd index 93d34b33..11775bcd 100644 --- a/scripts/threats.gd +++ b/scripts/threats.gd @@ -18,7 +18,7 @@ class Threat: var power: float ## Уровень принимаемого сигнала, дБм. var proto: String ## Тип протокола источника сигнала. var rkrp: String ## Рекомендуемый режим помехи. - var rparams: String ## Рекомендуемые параметры помехи. + var rparams: Dictionary ## Рекомендуемые параметры помехи. var salt: float ## Координаты старта, высота от уровня моря, м. var slat: float ## Координаты старта, широта в градусах. var slon: float ## Координаты старта, долгота в градусах. From 70e5cfd1115de3ae16888af45a8571f3319d9cda Mon Sep 17 00:00:00 2001 From: MaD_CaT Date: Wed, 24 Sep 2025 14:02:20 +0300 Subject: [PATCH 04/12] =?UTF-8?q?=D0=94=D0=BE=D1=80=D0=B0=D0=B1=D0=BE?= =?UTF-8?q?=D1=82=D0=BA=D0=B0.=20=D0=9F=D0=B5=D1=80=D0=B5=D0=BA=D0=BB?= =?UTF-8?q?=D1=8E=D1=87=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=B2=D1=8B=D0=B1=D1=80?= =?UTF-8?q?=D0=B0=D0=BD=D0=BD=D0=BE=D0=B9=20=D0=BF=D0=BE=D0=BC=D0=B5=D1=85?= =?UTF-8?q?=D0=B8=20=D0=BF=D1=80=D0=B8=20=D0=B2=D0=BA=D0=BB=D1=8E=D1=87?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B8=20=D1=80=D0=B5=D0=BA=D0=BE=D0=BC=D0=B5?= =?UTF-8?q?=D0=BD=D0=B4=D0=BE=D0=B2=D0=B0=D0=BD=D0=BD=D0=BE=D0=B9=20=D0=BE?= =?UTF-8?q?=D1=82=20=D1=86=D0=B5=D0=BB=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 | 11 +++++++++++ scripts/interfer.gd | 2 ++ 2 files changed, 13 insertions(+) diff --git a/scenes/frame-ecm-list/scroll-ecm-list.gd b/scenes/frame-ecm-list/scroll-ecm-list.gd index 7acaa671..129162f2 100644 --- a/scenes/frame-ecm-list/scroll-ecm-list.gd +++ b/scenes/frame-ecm-list/scroll-ecm-list.gd @@ -84,6 +84,7 @@ func _ready(): signaller.connect('rto_threat_unsel', Callable(self, 'on_rto_threat_unsel')) signaller.connect('rto_threat_sel', Callable(self, 'on_rto_threat_sel').bind(table_index)) interfer.connect('interfer_update', Callable(self, 'on_interfer_update').bind(table_index)) + interfer.connect('interfer_recommendate', Callable(self, 'on_interfer_recommendate')) $table.connect('row_pressed', Callable(self, 'on_row_pressed')) call_deferred('init_table') @@ -159,3 +160,13 @@ func map_th_to_row(ecm) -> Array: if INTERFER_STATE.has(ecm.svk): row[COLUMN_STATE] = '%s' % INTERFER_STATE[ecm.svk] return row + + +func on_interfer_recommendate(ecm): + var sel_rows: Array + $table.get_selected_rows(sel_rows) + if not len(sel_rows): return + var row = sel_rows[0] + var sel_ecm = $table.get_node_user_data(0, sel_rows[0]) + if ecm == sel_ecm: + signaller.emit_signal('interfer_selected', ecm) diff --git a/scripts/interfer.gd b/scripts/interfer.gd index 70b69c32..3876e404 100644 --- a/scripts/interfer.gd +++ b/scripts/interfer.gd @@ -144,6 +144,7 @@ signal interfer_run(ecm: Interfer) ## Вызывается в м signal interfer_error(ecm: Interfer, msg: String) ## Вызывается при ошибке. signal interfer_update(ecm: Interfer) ## Вызывается при обновлении помехи. signal interfer_resized(ecms: Dictionary) ## Вызывается при изменении количества сеансов помех. +signal interfer_recommendate(ecm: Interfer) ## Вызывается когда назначается рекомендуемая для цели помеха ## Отправляет словарь помех в юнит, для запаковки и отправки в 5П28. @@ -492,6 +493,7 @@ func on_threats_update(threat, ecms, unit_caps): if krp != '': ecm.krp = krp set_rparams(threat, ecm.params) + emit_signal('interfer_recommendate', ecm) ecm.kni = threat.aoa set_nmfs(ecm) if threat.tmod != 'fm': From 50a7f46dc8c7d6ece4a2bae5d56d2e4d3a9c1560 Mon Sep 17 00:00:00 2001 From: MaD_CaT Date: Wed, 24 Sep 2025 14:15:30 +0300 Subject: [PATCH 05/12] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5.=20=D0=9F=D1=80=D0=BE=D0=B2?= =?UTF-8?q?=D0=B5=D1=80=D0=BA=D0=B0=20=D1=84=D0=BB=D0=B0=D0=B3=D0=BE=D0=B2?= =?UTF-8?q?=20=D0=B4=D0=BE=D1=81=D1=82=D0=BE=D0=B2=D0=B5=D1=80=D0=BD=D0=BE?= =?UTF-8?q?=D1=81=D1=82=D0=B8=20=D1=80=D0=B5=D0=BA=D0=BE=D0=BC=D0=B5=D0=BD?= =?UTF-8?q?=D0=B4=D1=83=D0=B5=D0=BC=D0=BE=D0=B9=20=D0=BF=D0=BE=D0=BC=D0=B5?= =?UTF-8?q?=D1=85=D0=B8=20=D0=B4=D0=BB=D1=8F=20=D1=86=D0=B5=D0=BB=D0=B8.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scripts/interfer.gd | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/scripts/interfer.gd b/scripts/interfer.gd index 3876e404..9ac5ce1d 100644 --- a/scripts/interfer.gd +++ b/scripts/interfer.gd @@ -278,7 +278,7 @@ func on_interfer_create(interfer_name, sel_threats, fs_arr, power, u, ecms) -> v var id = item.id param['freq'] = item.freq param['width'] = item.width - if item.rkrp != '': + if (item.rkrp != '') and item.fflags.rkrp: var krp = get_krp(item) if krp != '': ecm_name = krp @@ -299,7 +299,7 @@ func on_interfer_create(interfer_name, sel_threats, fs_arr, power, u, ecms) -> v if th != null: param['freq'] = th.freq param['width'] = th.width - if th.rkrp != '': + if (th.rkrp != '') and th.fflags.rkrp: var krp = get_krp(th) if krp != '': ecm_name = krp @@ -488,7 +488,7 @@ func on_threats_update(threat, ecms, unit_caps): ecm = ecms[ecm_i] ecm.params['freq'] = threat.freq ecm.params['width'] = threat.width - if threat.rkrp != '': + if (threat.rkrp != '') and threat.fflags.rkrp: var krp = get_krp(threat) if krp != '': ecm.krp = krp From cc5c74071a48bccc0fa44f7529b9d2ddf2172d28 Mon Sep 17 00:00:00 2001 From: MaD_CaT Date: Fri, 26 Sep 2025 10:55:24 +0300 Subject: [PATCH 06/12] =?UTF-8?q?=D0=94=D0=BE=D1=80=D0=B0=D0=B1=D0=BE?= =?UTF-8?q?=D1=82=D0=BA=D0=B0.=20=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BD=D0=BE=D0=B2=D0=BE=D0=B9=20?= =?UTF-8?q?=D0=BF=D0=BE=D0=BC=D0=B5=D1=85=D0=B8=20=D0=95=D0=9F=D0=A0=D0=9B?= =?UTF-8?q?=D0=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scenes/button-flat/button-flat.tscn | 2 ++ scenes/button-flat/nine-patch-button.gd | 5 ++++ scenes/frame-ecm-list/frm-ecm-list.tscn | 5 ++++ scenes/frame-ecm-list/scroll-ecm-list.gd | 3 ++- scenes/grid-buttons-ecm/grid-buttons-ecm.tscn | 27 ++++++++++++++++++- scenes/работа/работа.tscn | 3 +++ scenes/эмс/эмс.tscn | 2 ++ scripts/interfer.gd | 7 +++-- 8 files changed, 50 insertions(+), 4 deletions(-) diff --git a/scenes/button-flat/button-flat.tscn b/scenes/button-flat/button-flat.tscn index 6fe161c8..b5e777f7 100644 --- a/scenes/button-flat/button-flat.tscn +++ b/scenes/button-flat/button-flat.tscn @@ -56,6 +56,7 @@ offset_right = 20.0 offset_bottom = 20.0 theme_override_styles/panel = SubResource("1") script = ExtResource("1_ui6sg") +font_size = null [node name="back" type="Sprite2D" parent="."] material = SubResource("ShaderMaterial_hhdyc") @@ -79,6 +80,7 @@ axis_stretch_vertical = 2 layout_mode = 2 theme_override_colors/font_outline_color = Color(0, 0, 0, 1) theme_override_constants/outline_size = 4 +theme_override_font_sizes/font_size = 15 theme_override_styles/focus = SubResource("4") theme_override_styles/disabled = SubResource("5") theme_override_styles/hover = SubResource("2") diff --git a/scenes/button-flat/nine-patch-button.gd b/scenes/button-flat/nine-patch-button.gd index 7e2e61d0..f18ef37e 100644 --- a/scenes/button-flat/nine-patch-button.gd +++ b/scenes/button-flat/nine-patch-button.gd @@ -59,6 +59,11 @@ var _pressed: = false $button.set_toggle_mode(val) +@export var font_size: int = true: + set(val): + $button.add_theme_font_size_override('theme_override_font_sizes/font_size', val) + + func set_pressed(val: bool): pressed = val diff --git a/scenes/frame-ecm-list/frm-ecm-list.tscn b/scenes/frame-ecm-list/frm-ecm-list.tscn index e0086614..b1c524e6 100644 --- a/scenes/frame-ecm-list/frm-ecm-list.tscn +++ b/scenes/frame-ecm-list/frm-ecm-list.tscn @@ -57,6 +57,7 @@ size_flags_vertical = 3 tooltip_text = "Включает принудительную помеху" strips_rotation = 15.0 text = "СРН" +font_size = null metadata/rfi_name = "srn" [node name="btn_jtids" parent="grd_forced" groups=["группа-принудительно"] instance=ExtResource("4_7ys3c")] @@ -66,6 +67,7 @@ size_flags_horizontal = 3 size_flags_vertical = 3 strips_rotation = 15.0 text = "СПРС" +font_size = null metadata/rfi_name = "sprs" [node name="btn_kupd" parent="grd_forced" groups=["группа-принудительно"] instance=ExtResource("4_7ys3c")] @@ -75,6 +77,7 @@ size_flags_vertical = 3 tooltip_text = "Кнопка для принудительного включения группы секторов в режим КУПД" strips_rotation = 15.0 text = "КУПД" +font_size = null metadata/rfi_name = "kupd" [node name="btn_panika" parent="grd_forced" groups=["группа-принудительно"] instance=ExtResource("4_7ys3c")] @@ -84,6 +87,7 @@ size_flags_vertical = 3 tooltip_text = "Кнопка для принудительного включения группы секторов в режим КУПД" strips_rotation = 15.0 text = "Паника" +font_size = null metadata/rfi_name = "" [node name="btn_cancel" parent="grd_forced" groups=["прин-секторы-срн"] instance=ExtResource("4_7ys3c")] @@ -92,4 +96,5 @@ size_flags_horizontal = 3 size_flags_vertical = 3 strips_rotation = 15.0 text = "Очистить" +font_size = null metadata/rfi_name = "" diff --git a/scenes/frame-ecm-list/scroll-ecm-list.gd b/scenes/frame-ecm-list/scroll-ecm-list.gd index 129162f2..cbfb7a8c 100644 --- a/scenes/frame-ecm-list/scroll-ecm-list.gd +++ b/scenes/frame-ecm-list/scroll-ecm-list.gd @@ -36,7 +36,8 @@ const INTERFER_NAMES = { 'svi1': 'СВ-И1', 'k1': 'K1', 'svm2': 'СВ-М2', - 'ozp1': 'ОЗП-1'} + 'ozp1': 'ОЗП-1', + 'eprls': 'ЕПРЛС',} ## Индексы колонок diff --git a/scenes/grid-buttons-ecm/grid-buttons-ecm.tscn b/scenes/grid-buttons-ecm/grid-buttons-ecm.tscn index 3c28e215..ddad15be 100644 --- a/scenes/grid-buttons-ecm/grid-buttons-ecm.tscn +++ b/scenes/grid-buttons-ecm/grid-buttons-ecm.tscn @@ -5,7 +5,7 @@ [node name="grd_btns" type="GridContainer"] offset_right = 1096.0 offset_bottom = 54.0 -columns = 15 +columns = 16 [node name="btn_off" parent="." groups=["группа-режим-помехи"] instance=ExtResource("1_oy80h")] layout_mode = 2 @@ -14,6 +14,7 @@ size_flags_vertical = 3 strips_rotation = 30.0 text = "Откл." disabled = true +font_size = 1 metadata/rfi_name = "off" [node name="btn_p12" parent="." groups=["группа-режим-помехи"] instance=ExtResource("1_oy80h")] @@ -23,6 +24,7 @@ size_flags_vertical = 3 strips_rotation = 30.0 text = "МЧМ-1" disabled = true +font_size = 1 metadata/rfi_name = "mchm1" [node name="btn_p16" parent="." groups=["группа-режим-помехи"] instance=ExtResource("1_oy80h")] @@ -32,6 +34,7 @@ size_flags_vertical = 3 strips_rotation = 30.0 text = "СРН-И1" disabled = true +font_size = 1 metadata/rfi_name = "srni1" [node name="btn_p15" parent="." groups=["группа-режим-помехи"] instance=ExtResource("1_oy80h")] @@ -41,6 +44,7 @@ size_flags_vertical = 3 strips_rotation = 30.0 text = "СРН-М2" disabled = true +font_size = 1 metadata/rfi_name = "srnm2" [node name="btn_p18" parent="." groups=["группа-режим-помехи"] instance=ExtResource("1_oy80h")] @@ -50,6 +54,7 @@ size_flags_vertical = 3 strips_rotation = 30.0 text = "СРН-GPS" disabled = true +font_size = 1 metadata/rfi_name = "srngps" [node name="btn_p14" parent="." groups=["группа-режим-помехи"] instance=ExtResource("1_oy80h")] @@ -59,6 +64,7 @@ size_flags_vertical = 3 strips_rotation = 30.0 text = "ПД-М4" disabled = true +font_size = 1 metadata/rfi_name = "pdm4" [node name="btn_p13" parent="." groups=["группа-режим-помехи"] instance=ExtResource("1_oy80h")] @@ -68,6 +74,7 @@ size_flags_vertical = 3 strips_rotation = 30.0 text = "ПД-М2" disabled = true +font_size = 1 metadata/rfi_name = "pdm2" [node name="btn_p11" parent="." groups=["группа-режим-помехи"] instance=ExtResource("1_oy80h")] @@ -77,6 +84,7 @@ size_flags_vertical = 3 strips_rotation = 30.0 text = "ЛЧМ-1" disabled = true +font_size = 1 metadata/rfi_name = "lchm1" [node name="btn_p17" parent="." groups=["группа-режим-помехи"] instance=ExtResource("1_oy80h")] @@ -86,6 +94,7 @@ size_flags_vertical = 3 strips_rotation = 30.0 text = "ЛЧМ-2" disabled = true +font_size = 1 metadata/rfi_name = "lchm2" [node name="btn_p10" parent="." groups=["группа-режим-помехи"] instance=ExtResource("1_oy80h")] @@ -95,6 +104,7 @@ size_flags_vertical = 3 strips_rotation = 30.0 text = "ПД-М4С" disabled = true +font_size = 1 metadata/rfi_name = "pdm4s" [node name="btn_p9" parent="." groups=["группа-режим-помехи"] instance=ExtResource("1_oy80h")] @@ -104,6 +114,7 @@ size_flags_vertical = 3 strips_rotation = 30.0 text = "ПД-ЧМ" disabled = true +font_size = 1 metadata/rfi_name = "pdchm" [node name="btn_p8" parent="." groups=["группа-режим-помехи"] instance=ExtResource("1_oy80h")] @@ -113,6 +124,7 @@ size_flags_vertical = 3 strips_rotation = 30.0 text = "СВ-И1" disabled = true +font_size = 1 metadata/rfi_name = "svi1" [node name="btn_p7" parent="." groups=["группа-режим-помехи"] instance=ExtResource("1_oy80h")] @@ -122,6 +134,7 @@ size_flags_vertical = 3 strips_rotation = 30.0 text = "K1" disabled = true +font_size = 1 metadata/rfi_name = "k1" [node name="btn_p6" parent="." groups=["группа-режим-помехи"] instance=ExtResource("1_oy80h")] @@ -131,6 +144,7 @@ size_flags_vertical = 3 strips_rotation = 30.0 text = "СВ-М2" disabled = true +font_size = 1 metadata/rfi_name = "svm2" [node name="btn_p5" parent="." groups=["группа-режим-помехи"] instance=ExtResource("1_oy80h")] @@ -140,4 +154,15 @@ size_flags_vertical = 3 strips_rotation = 30.0 text = "ОЗП-1" disabled = true +font_size = 1 metadata/rfi_name = "ozp1" + +[node name="btn_p19" parent="." groups=["группа-режим-помехи"] instance=ExtResource("1_oy80h")] +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 +strips_rotation = 30.0 +text = "ЕПРЛС" +disabled = true +font_size = 1 +metadata/rfi_name = "eprls" diff --git a/scenes/работа/работа.tscn b/scenes/работа/работа.tscn index 6d645182..9e1abc88 100644 --- a/scenes/работа/работа.tscn +++ b/scenes/работа/работа.tscn @@ -174,6 +174,7 @@ size_flags_vertical = 3 tooltip_text = "Кнопка для выбора сектора при помощи клика мышкой" strips_rotation = 25.0 text = "Строб" +font_size = null metadata/state = 0 [node name="btn_threats" parent="btns_select" groups=["группа-режим-выбора"] instance=ExtResource("8_k0iv2")] @@ -183,6 +184,7 @@ size_flags_vertical = 3 tooltip_text = "Кнопка для выбора сектора при помощи клика мышкой" strips_rotation = 25.0 text = "Цель" +font_size = null metadata/state = 1 [node name="btn_fs_sector" parent="btns_select" groups=["группа-режим-выбора"] instance=ExtResource("8_k0iv2")] @@ -192,6 +194,7 @@ size_flags_vertical = 3 tooltip_text = "Кнопка для выбора сектора при помощи клика мышкой" strips_rotation = 25.0 text = "Сектор" +font_size = null metadata/state = 2 [node name="chk_auto" type="CheckBox" parent="."] diff --git a/scenes/эмс/эмс.tscn b/scenes/эмс/эмс.tscn index 32717b0e..9198fcfc 100644 --- a/scenes/эмс/эмс.tscn +++ b/scenes/эмс/эмс.tscn @@ -81,6 +81,7 @@ offset_right = 1583.0 offset_bottom = 85.0 strips_rotation = 10.0 text = "Прочитать" +font_size = null [node name="btn_flash_write" parent="." instance=ExtResource("2_eju8r")] layout_mode = 0 @@ -90,6 +91,7 @@ offset_right = 1583.0 offset_bottom = 129.0 strips_rotation = 10.0 text = "Записать" +font_size = null [node name="btn_save" type="Button" parent="."] layout_mode = 0 diff --git a/scripts/interfer.gd b/scripts/interfer.gd index 9ac5ce1d..d45c5f67 100644 --- a/scripts/interfer.gd +++ b/scripts/interfer.gd @@ -18,7 +18,8 @@ const ITERFER_MODE = { 'svi1': [INTERFER_IQFILE, SVI1_PARAMS, 20], 'svm2': [INTERFER_IQFILE, SVM2_PARAMS, 21], 'k1': [INTERFER_IQFILE, K1_PARAMS, 50], - 'ozp1': [INTERFER_IQFILE, OZP1_PARAMS, 51] } + 'ozp1': [INTERFER_IQFILE, OZP1_PARAMS, 51], + 'eprls': [INTERFER_IQFILE, EPRLS_PARAMS, 52], } const RECOMMEND_INTERFER = { 'ПСП + ФМ-2': 'srni1', @@ -59,7 +60,9 @@ const SVM2_PARAMS = {'files': {1: ['SVM2_LIT2.pcm', 1017], 2: ['SVM2_LIT3.pcm', 1156]}, 'call_proc': 'call_diap', 'par_names' : ['freq', 'filename']} - +const EPRLS_PARAMS = {'files' : 'ERLS.pcm', + 'call_proc' : 'call_all_diap', + 'par_names' : ['freq', 'filename']} # Файл : Ключ (ширина): ['имя файла'] const PDCHM_PARAMS = {'files': { 5 : 'pdchm_5.pcm', From 50e7222b5788fa6c9e0d5ee9f499b7f61d1d758d Mon Sep 17 00:00:00 2001 From: MaD_CaT Date: Fri, 26 Sep 2025 14:44:34 +0300 Subject: [PATCH 07/12] =?UTF-8?q?=D0=94=D0=BE=D1=80=D0=B0=D0=B1=D0=BE?= =?UTF-8?q?=D1=82=D0=BA=D0=B0.=20=D0=9F=D0=B5=D1=80=D0=B5=D0=B4=D0=B5?= =?UTF-8?q?=D0=BB=D0=B0=D0=BD=20=D0=BC=D0=B5=D1=85=D0=B0=D0=BD=D0=B8=D0=B7?= =?UTF-8?q?=D0=BC=20=D0=BE=D1=82=D0=BA=D0=BB=D1=8E=D1=87=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D1=8F=20=D0=BF=D0=BE=D0=BC=D0=B5=D1=85=D0=B8,=20=D0=B4=D0=BB?= =?UTF-8?q?=D1=8F=20=D0=B5=D1=91=20=D0=BE=D1=82=D0=BA=D0=BB=D1=8E=D1=87?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=BD=D0=B0=D0=B4=D0=BE=20=D0=BE?= =?UTF-8?q?=D1=82=D0=BF=D1=80=D0=B0=D0=B2=D0=B8=D1=82=D1=8C=20=D1=82=D0=BE?= =?UTF-8?q?=D0=BB=D1=8C=D0=BA=D0=BE=20=D1=81=D0=B0=D0=BC=D1=83=20=D0=BF?= =?UTF-8?q?=D0=BE=D0=BC=D0=B5=D1=85=D1=83.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scenes/frame-ecm-list/scroll-ecm-list.gd | 10 +--------- scenes/журнал/журнал.gd | 2 +- scenes/работа/работа.gd | 7 ------- scripts/interfer.gd | 19 +++++++++++++++---- scripts/signaller.gd | 2 +- 5 files changed, 18 insertions(+), 22 deletions(-) diff --git a/scenes/frame-ecm-list/scroll-ecm-list.gd b/scenes/frame-ecm-list/scroll-ecm-list.gd index cbfb7a8c..eb3beee7 100644 --- a/scenes/frame-ecm-list/scroll-ecm-list.gd +++ b/scenes/frame-ecm-list/scroll-ecm-list.gd @@ -122,21 +122,13 @@ func on_interfer_new(ecm, table_index): signaller.emit_signal('interfer_selected', ecm) -func on_interfer_off(ecm, ecms, thrs, table_index): - var sz = ecms.size() +func on_interfer_off(ecm, table_index): $table.remove_row(table_index[ecm.ispp]) rehash(table_index) - ecms.erase(ecm.ispp) - thrs.erase(ecm.ispp) - interfer.cu.erase(ecm.ispp) - interfer.fs.erase(ecm.ispp) - interfer.push_id(ecm.ispp) var sel_rows: Array $table.get_selected_rows(sel_rows) if not len(sel_rows): signaller.emit_signal('interfer_selected', null) - if sz != ecms.size(): - interfer.call_deferred('emit_signal', 'interfer_resized', ecms) ## Перестраивает индекс таблицы. Вызывать при удалении строки diff --git a/scenes/журнал/журнал.gd b/scenes/журнал/журнал.gd index dc5ab850..401ad0d8 100644 --- a/scenes/журнал/журнал.gd +++ b/scenes/журнал/журнал.gd @@ -5,7 +5,7 @@ func on_line_changed(unit_inst): log.message(Logger.INFO, '\"%s\" изменен func on_command_fail(unit_inst): log.message(Logger.ERROR, '\"%s\" команда не выполнена' % unit_inst.name) func on_threats_changed(th: Object, msg: String): log.message(Logger.INFO, '%s: %s' % [msg, th.to_string()]) func on_parse_error(unit_inst, msg: String): log.message(Logger.ERROR, '%s: %s' % [unit_inst.name, msg]) -func on_interfer_off(ecm, _ecms, _thrs,msg: String): log.message(Logger.INFO, '%s: %s' % [msg, ecm.to_string()]) +func on_interfer_off(ecm, msg: String): log.message(Logger.INFO, '%s: %s' % [msg, ecm.to_string()]) func on_set_program_mode(msg: String): log.message(Logger.INFO, msg) func on_interfer_new(ecm, msg: String): diff --git a/scenes/работа/работа.gd b/scenes/работа/работа.gd index 242edf4b..9f46f221 100644 --- a/scenes/работа/работа.gd +++ b/scenes/работа/работа.gd @@ -229,13 +229,6 @@ func on_interfer_off_all(): update_fs_colors() -func on_interfer_off(ecm_id): - fs_active.erase(ecm_id) - fs_selected.erase(ecm_id) - fs_active.clear() - update_fs_colors() - - ## Обработчик сигнала обнаружения цели. func on_threat_new(th) -> void: var bip = Bip.instantiate() diff --git a/scripts/interfer.gd b/scripts/interfer.gd index d45c5f67..37cd4b81 100644 --- a/scripts/interfer.gd +++ b/scripts/interfer.gd @@ -180,7 +180,7 @@ func _ready() -> void: signaller.connect('interfer_new', Callable(self, 'send_ecm').bind(unit_caps)) signaller.connect('interfer_off_all', Callable(self, 'on_interfer_off_all').bind(unit_caps, ecms)) signaller.connect('th_aoa_update', Callable(self, 'on_th_aoa_update').bind(ecms, unit_caps)) - signaller.connect('interfer_off', Callable(self, 'on_interfer_off')) + signaller.connect('interfer_off', Callable(self, 'on_interfer_off').bind(ecms)) signaller.connect('manual_control', Callable(self, 'on_manual_control')) signaller.connect('full_auto', Callable(self, 'on_full_auto')) signaller.connect('interfer_prinuditelno', Callable(self, 'on_interfer_prinuditelno')) @@ -391,7 +391,7 @@ func interfer_create(u, interfer_name, ecms, param, kni, id, dict, source_interf log.error('Ошибка выбора модуля ФС для помехи: %s' %[ecm.ispp]) signaller.emit_signal('interfer_new', ecm) if interfer_name == 'off': - signaller.emit_signal('interfer_off', ecm, ecms, thrs) + signaller.emit_signal('interfer_off', ecm) thrs.erase(ispp) ecm.tick_tx = Time.get_ticks_msec() send_ecm(ecm, u) @@ -414,7 +414,7 @@ func on_interfer_off_all(unit0, ecms: Dictionary) -> void: for ecm in ecms.values(): ecm.krp = INTERFER_OFF send_ecm(ecm, unit0) - signaller.emit_signal('interfer_off', ecm, ecms, thrs) + signaller.emit_signal('interfer_off', ecm) func on_threats_lost(th, ecms, unit0) -> void: @@ -424,7 +424,7 @@ func on_threats_lost(th, ecms, unit0) -> void: var ecm = ecms[ecm_id] ecm.krp = INTERFER_OFF send_ecm(ecm, unit0) - signaller.emit_signal('interfer_off', ecm, ecms, thrs) + signaller.emit_signal('interfer_off', ecm) func pop_id() -> int: @@ -596,3 +596,14 @@ func get_krp(threat: threats.Threat): krp = key return krp return krp + + +func on_interfer_off(ecm: Interfer, ecms): + var sz = ecms.size() + ecms.erase(ecm.ispp) + thrs.erase(ecm.ispp) + interfer.cu.erase(ecm.ispp) + interfer.fs.erase(ecm.ispp) + interfer.push_id(ecm.ispp) + if sz != ecms.size(): + interfer.call_deferred('emit_signal', 'interfer_resized', ecms) diff --git a/scripts/signaller.gd b/scripts/signaller.gd index d96201fd..9e2a7c34 100644 --- a/scripts/signaller.gd +++ b/scripts/signaller.gd @@ -107,7 +107,7 @@ signal interfer_new(ecm: interfer.Interfer) ## [param ecm] - Новая помеха.[br] ## [param ecms] - словарь помех.[br] ## [param thrs] - словарь id помех и связанных с ними целей.[br] -signal interfer_off(ecm: interfer.Interfer, ecms: Dictionary, thrs: Dictionary) +signal interfer_off(ecm: interfer.Interfer) ## Вызывается при нажатии отключить. From f817056fbb83fef11c502076c707d2468880bb29 Mon Sep 17 00:00:00 2001 From: lepshiy Date: Fri, 26 Sep 2025 14:47:03 +0300 Subject: [PATCH 08/12] =?UTF-8?q?=D1=82=D1=80=D0=B0=D1=81=D1=81=D0=B0.=20?= =?UTF-8?q?=D0=BF=D0=BE=D1=81=D1=82=D0=B0=D0=BD=D0=BE=D0=B2=D0=BA=D0=B0=20?= =?UTF-8?q?=D0=BF=D0=BE=D0=BC=D0=B5=D1=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scenes/настройки/настройки.tscn | 20 +++- scenes/работа/работа.tscn | 2 +- scripts/settings.gd | 2 +- scripts/trassa.gd | 186 +++++++++++++++++++++----------- 4 files changed, 140 insertions(+), 70 deletions(-) diff --git a/scenes/настройки/настройки.tscn b/scenes/настройки/настройки.tscn index b69067fc..64267b01 100644 --- a/scenes/настройки/настройки.tscn +++ b/scenes/настройки/настройки.tscn @@ -31,6 +31,7 @@ const SETTING_TABLE = [ ['Кнопка «JTIDS»', TableEdit, TableToggle, 'Разрешить отображение кнопки'], ['Кнопка «КУПД»', TableEdit, TableToggle, 'Разрешить отображение кнопки'], ['Внешнее управление', TableEdit, TableToggle, 'Передать управление в 5П28'], + ['Внешнее указание Трасса', TableEdit, TableToggle, 'Разрешить постановку помех от Трасса'], ['Кнопка «Подавление»', TableEdit, TableToggle, 'Разрешить отображение кнопки'], ['Виртуальная клавиатура', TableEdit, TableToggle, 'Включить отображение экранной клавиатуры'], ['Скрыть вкладку ЭМС 2', TableEdit, TableToggle, 'Отображать вкладку \\\"ЭМС-2\\\"'], @@ -63,10 +64,11 @@ const SETTING_TABLE = [ ['Адрес БПО правого борта', TableEdit, TableEdit, 'http-адрес для запроса состояния прибора БПО'] ] const EXTERNAL_CU = 16 ## Внешнее целеуказание -const SUPPRESS = 17 ## Строка - Подавление -const KEYBOARD = 18 ## Строка - Виртуальная клавиатура -const HIDE_EMS2 = 19 ## Строка - Скрыть вкладку ЭМС 2 -const COMMIT = 20 ## Строка - Версия УАРЭП +const TRASSA = 17 +const SUPPRESS = 18 ## Строка - Подавление +const KEYBOARD = 19 ## Строка - Виртуальная клавиатура +const HIDE_EMS2 = 20 ## Строка - Скрыть вкладку ЭМС 2 +const COMMIT = 21 ## Строка - Версия УАРЭП var name_to_line_index: = {} ## Для преобразования названия параметра в номер строки @@ -90,6 +92,11 @@ func on_external_cu_btn_pressed(btn) -> void: signaller.emit_signal('interfer_off_all') +func on_trassa_btn_pressed(btn) -> void: + var state = btn.button_pressed + ProjectSettings.set_setting('application/config/Внешнее указание Трасса', state) + + func on_vk_pressed(btn) -> void: var state = btn.button_pressed signaller.emit_signal('kb_pressed', state) @@ -206,6 +213,11 @@ func button_settings(): var extern_cu_node = $scroll_set/table.get_node2(1, EXTERNAL_CU).get_children()[0] extern_cu_node.connect('pressed', on_external_cu_btn_pressed.bind(extern_cu_node)) on_external_cu_btn_pressed(extern_cu_node) + + var trassa_node = $scroll_set/table.get_node2(1, TRASSA).get_children()[0] + trassa_node.connect('pressed', on_trassa_btn_pressed.bind(trassa_node)) + on_trassa_btn_pressed(trassa_node) + var vk_node = $scroll_set/table.get_node2(1, KEYBOARD).get_children()[0] vk_node.connect('pressed', on_vk_pressed.bind(vk_node)) var ems2_hide_node = $scroll_set/table.get_node2(1, HIDE_EMS2).get_children()[0] diff --git a/scenes/работа/работа.tscn b/scenes/работа/работа.tscn index 64b1bbd5..6d645182 100644 --- a/scenes/работа/работа.tscn +++ b/scenes/работа/работа.tscn @@ -305,6 +305,6 @@ text = "Масштаб:" [connection signal="drag_continue" from="." to="." method="_on_drag_continue"] [connection signal="toggled" from="btn_view" to="." method="on_button_view_toggled"] [connection signal="toggled" from="chk_auto" to="." method="on_value_changed"] -[connection signal="toggled" from="btn_activate" to="." method="on_btn_activate_toggled"] [connection signal="toggled" from="btn_activate" to="." method="on_btn_activate"] +[connection signal="toggled" from="btn_activate" to="." method="on_btn_activate_toggled"] [connection signal="toggled" from="btn_center" to="." method="on_btn_center_toggled"] diff --git a/scripts/settings.gd b/scripts/settings.gd index 09246d63..2ac22b72 100644 --- a/scripts/settings.gd +++ b/scripts/settings.gd @@ -10,7 +10,7 @@ var UnitProfiles: Dictionary[StringName, Array] = { \ 'уарэп-яу07-частный': ['yau07rx', ['10.1.1.2', 50002, false, true], 'IP-адрес для приёма частных сообщений от ЯУ-07'], 'уарэп-яу07-общий': ['yau07rx', ['*', 50000, true, true], 'IP-адрес для приёма широковещательных сообщений от ЯУ-07'], 'уарэп-капсрпб': ['capsrpb', ['127.0.0.1', 42023, 42022, false, true], 'IP-адрес для обмена сообщениями со службой \"МП550\" (СТЦ)'], - 'уарэп-трасса': ['capsrpb', ['127.0.0.1', 50200, 40241, false, true], 'IP-адрес для обмена сообщениями с \"Трассой\"'], + 'уарэп-трасса': ['trassa', ['127.0.0.1', 50200, 50200, false, true], 'IP-адрес для обмена сообщениями с \"Трассой\"'], 'уарэп-эмс': ['yau07tx', ['10.1.1.52', 50052, false, false], 'IP-адрес прибора УФ'], 'уарэп-яу07-2в': ['yau07tx', ['10.1.1.22', 50022, false, false], 'IP-адрес прибора ПРД-В2'], 'уарэп-яу07-2н': ['yau07tx', ['10.1.1.21', 50021, false, false], 'IP-адрес прибора ПРД-Н2'], diff --git a/scripts/trassa.gd b/scripts/trassa.gd index d623a480..fd1404bc 100644 --- a/scripts/trassa.gd +++ b/scripts/trassa.gd @@ -1,84 +1,142 @@ -class_name trassa_unit extends Node +class_name trassa_unit +extends Node -const ONLINE_TIMEOUT: int = 5000 ## Время ожидания данных -const REQUEST_PERIOD: int = 3000 ## Переиод запроса, мс +const ONLINE_TIMEOUT: int = 5000 # Время ожидания данных +const REQUEST_PERIOD: int = 3000 # Период отправки, мс +const WORDS_TOTAL: int = 75 +const NOINFO: int = 0x80000000 class Trassa extends unit.Unit: - - enum CmdCode { - START = 1, - STOP = 0, - INFO = 4, - } - - - func sciCalcFCS(src: PackedByteArray) -> int: - var fcs: int = 0 - for b in src: - fcs ^= b - print("FCS: ", fcs) - return fcs & 0xFF + var source_addr: Array + var tx_stack: Array[PackedByteArray] = [] + var _msg_counter: int = 0 + var ecms: Dictionary = {} # Словарь всех активных помех + var srn = 0 + var jtids = 0 func _init(nm: StringName) -> void: self.name = nm - tx_data.resize(10) - tx_data[0] = 0 #ID - tx_data[1] = 0 #Nc - tx_data[2] = 0 #RKS - tx_data[3] = 0 #RR - tx_data[4] = 0 #Td - tx_data[5] = 0 #Nt - tx_data[6] = 0 #Пакет от uarep-ctl - tx_data[7] = CmdCode.INFO #SRN - tx_data[8] = CmdCode.INFO #JTIDS - tx_data[9] = 0 #CRC - print("INIT: ", self.name) + tx_data.resize(WORDS_TOTAL) + tx_data.fill(NOINFO) + interfer.connect("interfer_update", Callable(self, "_on_interfer_update")) + interfer.connect("interfer_resized", Callable(self, "_on_interfer_resized")) + # Обработка полученного пакета func parse(rx_data: PackedByteArray, tick: int): - print("PARSE: ", tick, "size:", rx_data.size()) - if rx_data.size() != 40: - print("PARSE: ") - emit_signal("parse_failed", self) + rx_tick = tick + if not online: + online = true + emit_signal("line_changed", self) + var spb := StreamPeerBuffer.new() + spb.big_endian = true + spb.data_array = rx_data + var words: Array[int] = [] + while spb.get_position() < spb.data_array.size(): + words.append(spb.get_u32()) + if words.size() < 10: + emit_signal('parse_failed', self) return - var expected_fcs = sciCalcFCS(rx_data.slice(0, 39)) - if expected_fcs != rx_data[39]: - print("PARSE: ", expected_fcs, "Got:", rx_data[39]) - emit_signal("parse_failed", self) - return - var strings := [] - for i in range(10): - var offset = i * 4 - var line = rx_data.slice(offset, offset + 4) - print("PARSE: ", i, ":", line) - strings.append(line) - print("PARSE: ") - emit_signal("data_received", strings) + _msg_counter += 1 + tx_data.fill(NOINFO) + tx_data[0] = words[0] # ID + tx_data[1] = _msg_counter # Nc + tx_data[2] = 0x01 # Nб + tx_data[3] = 0x00 # Ск + tx_data[4] = 0x0194 # НТС + tx_data[5] = (0x0001 << 16) | 0x0080 # Ии + tx_data[6] = 0x01 # РКС + srn = words[7] # SRN + jtids = words[8] # JTIDS + + btn_trassa_pressed() + + tx_data[74] = _calc_crc(tx_data) + emit_signal("data_received", self) + # Проверка активности помехи + func _is_interfer_active(interfer_name: String) -> bool: + for ecm in ecms.values(): + if ecm.krp and ecm.krp == interfer_name: + return ecm.svk == 1 + return false + + + # Основной процесс отправки func process(tick: int) -> int: - var rc: = Error.ERR_BUSY + var rc := Error.ERR_BUSY if (tick - tx_tick) > REQUEST_PERIOD: tx_tick = tick rc = Error.OK - print("PROCESS: ", tick) - if online: - if (tick - rx_tick) > ONLINE_TIMEOUT: - online = false - emit_signal('line_changed', self) + var packet := PackedByteArray() + packet.resize(WORDS_TOTAL * 4) + for i in range(WORDS_TOTAL): + packet.encode_u32(i * 4, tx_data[i]) + tx_stack.append(packet) + + print(packet) + return rc + if online and (tick - rx_tick) > ONLINE_TIMEOUT: + online = false + emit_signal("line_changed", self) return rc - func build_packet() -> PackedByteArray: - var packet := PackedByteArray() - packet.resize(40) - for i in range(10): - var offset = i * 4 - packet[offset + 0] = i - packet[offset + 1] = i + 1 - packet[offset + 2] = i + 2 - packet[offset + 3] = i + 3 - packet[39] = sciCalcFCS(packet.slice(0, 39)) - print("BUILD: ", packet) - return packet + # CRC вычисление + func _calc_crc(data: Array) -> int: + var acc: int = 0 + for i in range(data.size() - 1): # кроме CRC + if i in [0, 1]: + continue + acc = (acc + (data[i] & 0xFFFFFFFF)) & 0xFFFFFFFF + return acc + + + # Обновление конкретной помехи + func _on_interfer_update(ecm_object: Object) -> void: + var ecm_data = { + "krp": ecm_object.krp, + "svk": ecm_object.svk, + "nmfs": ecm_object.nmfs + } + #prd.fs_caps_id[] + if ecm_data.krp: + ecms[ecm_data.krp] = ecm_data + print("Обновление krp:", ecm_data.krp, "svk:", ecm_data.svk, "fs:", ecm_data.nmfs) + + + # Обновление всех активных помех при изменении размера + func _on_interfer_resized(ecms_objects: Dictionary) -> void: + ecms.clear() + for ecm_id in ecms_objects: + var ecm_object = ecms_objects[ecm_id] + var ecm_data = { + "krp": ecm_object.krp, + "svk": ecm_object.svk, + "nmfs": ecm_object.nmfs + } + if ecm_data.krp: + ecms[ecm_data.krp] = ecm_data + print("Обновлен список: ") + for ecm_key in ecms: + var ecm = ecms[ecm_key] + if ecm.krp: + print("krp:", ecm.krp, "svk:", ecm.svk, "fs:", ecm.nmfs) + + + func btn_trassa_pressed() -> void: + var state = ProjectSettings.get_setting('application/config/Внешнее указание Трасса', false) + if state == true: + if srn == 1: + tx_data[65] = 1 + signaller.emit_signal('interfer_prinuditelno', frm_ecm_list.srn_sectors) + else: + tx_data[65] = 0 + + if jtids == 1: + tx_data[66] = 1 + signaller.emit_signal('interfer_prinuditelno', frm_ecm_list.jtids_sectors) + else: + tx_data[66] = 0 From 321a6b9810dc870964fde9b18313f14ba7a31747 Mon Sep 17 00:00:00 2001 From: lepshiy Date: Wed, 1 Oct 2025 16:44:40 +0300 Subject: [PATCH 09/12] =?UTF-8?q?=D1=82=D1=80=D0=B0=D1=81=D1=81=D0=B0.=20?= =?UTF-8?q?=D0=BF=D0=B0=D1=80=D1=81=D0=B8=D0=BD=D0=B3=20=D0=BF=D0=BE=D0=BB?= =?UTF-8?q?=D1=83=D1=87=D0=B5=D0=BD=D0=BD=D0=BE=D0=B3=D0=BE=20=D0=BF=D0=B0?= =?UTF-8?q?=D0=BA=D0=B5=D1=82=D0=B0=20=D0=BE=D1=82=20=D1=82=D1=80=D0=B0?= =?UTF-8?q?=D1=81=D1=81=D1=8B,=20=D0=BA=D0=BD=D0=BE=D0=BF=D0=BA=D0=B0=20?= =?UTF-8?q?=D1=82=D1=80=D0=B0=D1=81=D1=81=D1=8B=20=D0=B2=20=D0=BD=D0=B0?= =?UTF-8?q?=D1=81=D1=82=D1=80=D0=BE=D0=B9=D0=BA=D0=B0=D1=85,=20=D0=BF?= =?UTF-8?q?=D0=BE=D1=81=D1=82=D0=B0=D0=BD=D0=BE=D0=B2=D0=BA=D0=B0/=D1=81?= =?UTF-8?q?=D0=BD=D1=8F=D1=82=D0=B8=D0=B5=20=D0=BF=D0=BE=D0=BC=D0=B5=D1=85?= =?UTF-8?q?,=20=D1=81=D0=B1=D0=BE=D1=80=D0=BA=D0=B0=20=D0=B8=20=D0=BE?= =?UTF-8?q?=D1=82=D0=BF=D1=80=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20?= =?UTF-8?q?=D0=BF=D0=B0=D0=BA=D0=B5=D1=82=D0=B0=20=D0=B2=20=D1=82=D1=80?= =?UTF-8?q?=D0=B0=D1=81=D1=81=D1=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scenes/frame-ecm-list/frm-ecm-list.tscn | 10 +- scenes/работа/работа.tscn | 6 +- scripts/settings.gd | 2 +- scripts/trassa.gd | 169 ++++++++++++------------ 4 files changed, 97 insertions(+), 90 deletions(-) diff --git a/scenes/frame-ecm-list/frm-ecm-list.tscn b/scenes/frame-ecm-list/frm-ecm-list.tscn index b1c524e6..6508d419 100644 --- a/scenes/frame-ecm-list/frm-ecm-list.tscn +++ b/scenes/frame-ecm-list/frm-ecm-list.tscn @@ -57,7 +57,7 @@ size_flags_vertical = 3 tooltip_text = "Включает принудительную помеху" strips_rotation = 15.0 text = "СРН" -font_size = null +font_size = 1 metadata/rfi_name = "srn" [node name="btn_jtids" parent="grd_forced" groups=["группа-принудительно"] instance=ExtResource("4_7ys3c")] @@ -67,7 +67,7 @@ size_flags_horizontal = 3 size_flags_vertical = 3 strips_rotation = 15.0 text = "СПРС" -font_size = null +font_size = 1 metadata/rfi_name = "sprs" [node name="btn_kupd" parent="grd_forced" groups=["группа-принудительно"] instance=ExtResource("4_7ys3c")] @@ -77,7 +77,7 @@ size_flags_vertical = 3 tooltip_text = "Кнопка для принудительного включения группы секторов в режим КУПД" strips_rotation = 15.0 text = "КУПД" -font_size = null +font_size = 1 metadata/rfi_name = "kupd" [node name="btn_panika" parent="grd_forced" groups=["группа-принудительно"] instance=ExtResource("4_7ys3c")] @@ -87,7 +87,7 @@ size_flags_vertical = 3 tooltip_text = "Кнопка для принудительного включения группы секторов в режим КУПД" strips_rotation = 15.0 text = "Паника" -font_size = null +font_size = 1 metadata/rfi_name = "" [node name="btn_cancel" parent="grd_forced" groups=["прин-секторы-срн"] instance=ExtResource("4_7ys3c")] @@ -96,5 +96,5 @@ size_flags_horizontal = 3 size_flags_vertical = 3 strips_rotation = 15.0 text = "Очистить" -font_size = null +font_size = 1 metadata/rfi_name = "" diff --git a/scenes/работа/работа.tscn b/scenes/работа/работа.tscn index 9e1abc88..a1667359 100644 --- a/scenes/работа/работа.tscn +++ b/scenes/работа/работа.tscn @@ -174,7 +174,7 @@ size_flags_vertical = 3 tooltip_text = "Кнопка для выбора сектора при помощи клика мышкой" strips_rotation = 25.0 text = "Строб" -font_size = null +font_size = 1 metadata/state = 0 [node name="btn_threats" parent="btns_select" groups=["группа-режим-выбора"] instance=ExtResource("8_k0iv2")] @@ -184,7 +184,7 @@ size_flags_vertical = 3 tooltip_text = "Кнопка для выбора сектора при помощи клика мышкой" strips_rotation = 25.0 text = "Цель" -font_size = null +font_size = 1 metadata/state = 1 [node name="btn_fs_sector" parent="btns_select" groups=["группа-режим-выбора"] instance=ExtResource("8_k0iv2")] @@ -194,7 +194,7 @@ size_flags_vertical = 3 tooltip_text = "Кнопка для выбора сектора при помощи клика мышкой" strips_rotation = 25.0 text = "Сектор" -font_size = null +font_size = 1 metadata/state = 2 [node name="chk_auto" type="CheckBox" parent="."] diff --git a/scripts/settings.gd b/scripts/settings.gd index 2ac22b72..8d716db2 100644 --- a/scripts/settings.gd +++ b/scripts/settings.gd @@ -10,7 +10,7 @@ var UnitProfiles: Dictionary[StringName, Array] = { \ 'уарэп-яу07-частный': ['yau07rx', ['10.1.1.2', 50002, false, true], 'IP-адрес для приёма частных сообщений от ЯУ-07'], 'уарэп-яу07-общий': ['yau07rx', ['*', 50000, true, true], 'IP-адрес для приёма широковещательных сообщений от ЯУ-07'], 'уарэп-капсрпб': ['capsrpb', ['127.0.0.1', 42023, 42022, false, true], 'IP-адрес для обмена сообщениями со службой \"МП550\" (СТЦ)'], - 'уарэп-трасса': ['trassa', ['127.0.0.1', 50200, 50200, false, true], 'IP-адрес для обмена сообщениями с \"Трассой\"'], + 'уарэп-трасса': ['trassa', ['127.0.0.1', 50200, 10004, false, true], 'IP-адрес для обмена сообщениями с \"Трассой\"'], 'уарэп-эмс': ['yau07tx', ['10.1.1.52', 50052, false, false], 'IP-адрес прибора УФ'], 'уарэп-яу07-2в': ['yau07tx', ['10.1.1.22', 50022, false, false], 'IP-адрес прибора ПРД-В2'], 'уарэп-яу07-2н': ['yau07tx', ['10.1.1.21', 50021, false, false], 'IP-адрес прибора ПРД-Н2'], diff --git a/scripts/trassa.gd b/scripts/trassa.gd index fd1404bc..428e2e82 100644 --- a/scripts/trassa.gd +++ b/scripts/trassa.gd @@ -8,19 +8,20 @@ const NOINFO: int = 0x80000000 class Trassa extends unit.Unit: + var unit_caps = network.get_unit_instance('уарэп-капсрпб') var source_addr: Array - var tx_stack: Array[PackedByteArray] = [] - var _msg_counter: int = 0 + var tx_stack: Array[int] = [] + var msg_counter: int = 0 var ecms: Dictionary = {} # Словарь всех активных помех var srn = 0 var jtids = 0 + # Инициализация func _init(nm: StringName) -> void: self.name = nm - tx_data.resize(WORDS_TOTAL) - tx_data.fill(NOINFO) - interfer.connect("interfer_update", Callable(self, "_on_interfer_update")) - interfer.connect("interfer_resized", Callable(self, "_on_interfer_resized")) + tx_stack.resize(WORDS_TOTAL) + tx_stack.fill(NOINFO) + interfer.connect("interfer_resized", Callable(self, "on_interfer_resized")) # Обработка полученного пакета @@ -29,59 +30,72 @@ class Trassa extends unit.Unit: if not online: online = true emit_signal("line_changed", self) - var spb := StreamPeerBuffer.new() - spb.big_endian = true - spb.data_array = rx_data var words: Array[int] = [] - while spb.get_position() < spb.data_array.size(): - words.append(spb.get_u32()) + var offset: int = 0 + while offset < rx_data.size(): + if offset + 4 <= rx_data.size(): + var word = rx_data.decode_u32(offset) + words.append(word) + offset += 4 + else: + break if words.size() < 10: emit_signal('parse_failed', self) - return - _msg_counter += 1 - tx_data.fill(NOINFO) - tx_data[0] = words[0] # ID - tx_data[1] = _msg_counter # Nc - tx_data[2] = 0x01 # Nб - tx_data[3] = 0x00 # Ск - tx_data[4] = 0x0194 # НТС - tx_data[5] = (0x0001 << 16) | 0x0080 # Ии - tx_data[6] = 0x01 # РКС - srn = words[7] # SRN - jtids = words[8] # JTIDS - + tx_stack.fill(NOINFO) + tx_stack[0] = words[0] # ID + tx_stack[1] = msg_counter # Nc + tx_stack[2] = 0x01 # Nб + tx_stack[3] = 0x00 # Ск + tx_stack[4] = 0x0194 # НТС + tx_stack[5] = (0x0001 << 16) | 0x0080 # Ии + tx_stack[6] = 0x01 # РКС + srn = words[7] # SRN + jtids = words[8] # JTIDS btn_trassa_pressed() - - tx_data[74] = _calc_crc(tx_data) + interfer_data() + tx_stack[74] = _calc_crc(tx_stack) emit_signal("data_received", self) - # Проверка активности помехи - func _is_interfer_active(interfer_name: String) -> bool: + func interfer_data() -> void: + for i in range(67, 74): + tx_stack[i] = 0 for ecm in ecms.values(): - if ecm.krp and ecm.krp == interfer_name: - return ecm.svk == 1 - return false - + if ecm.svk == 1: + var nmfs_value = ecm.nmfs + var fs_key = get_fs_key(nmfs_value) + if fs_key != NOINFO: + var string_index = fs_key / 4 + var bit_position = fs_key % 4 + if string_index >= 0 and string_index < 7: + var target_string = 67 + string_index + tx_stack[target_string] |= (1 << bit_position) - # Основной процесс отправки - func process(tick: int) -> int: - var rc := Error.ERR_BUSY - if (tick - tx_tick) > REQUEST_PERIOD: - tx_tick = tick - rc = Error.OK - var packet := PackedByteArray() - packet.resize(WORDS_TOTAL * 4) - for i in range(WORDS_TOTAL): - packet.encode_u32(i * 4, tx_data[i]) - tx_stack.append(packet) - - print(packet) - return rc - if online and (tick - rx_tick) > ONLINE_TIMEOUT: + + func get_fs_key(nmfs_value: int) -> int: + if prd.fs_caps_id.has(nmfs_value): + return prd.fs_caps_id[nmfs_value] + return NOINFO + + + # Отправка пакета от uarep-ctl + func process(now_tick: int) -> int: + if online and ((now_tick - rx_tick) > ONLINE_TIMEOUT): online = false emit_signal("line_changed", self) - return rc + if (now_tick - tx_tick) > REQUEST_PERIOD: + tx_tick = now_tick + msg_counter += 1 + interfer_uarep() + interfer_data() + var data = PackedByteArray() + data.resize(WORDS_TOTAL * 4) + for i in range(WORDS_TOTAL): + data.encode_u32(i * 4, tx_stack[i]) + tx_data = data + tx_len = WORDS_TOTAL * 4 + return Error.OK + return Error.ERR_BUSY # CRC вычисление @@ -94,49 +108,42 @@ class Trassa extends unit.Unit: return acc - # Обновление конкретной помехи - func _on_interfer_update(ecm_object: Object) -> void: - var ecm_data = { - "krp": ecm_object.krp, - "svk": ecm_object.svk, - "nmfs": ecm_object.nmfs - } - #prd.fs_caps_id[] - if ecm_data.krp: - ecms[ecm_data.krp] = ecm_data - print("Обновление krp:", ecm_data.krp, "svk:", ecm_data.svk, "fs:", ecm_data.nmfs) + # Обновление всех активных помех + func on_interfer_resized(ecms_dic: Dictionary) -> void: ecms = ecms_dic - # Обновление всех активных помех при изменении размера - func _on_interfer_resized(ecms_objects: Dictionary) -> void: - ecms.clear() - for ecm_id in ecms_objects: - var ecm_object = ecms_objects[ecm_id] - var ecm_data = { - "krp": ecm_object.krp, - "svk": ecm_object.svk, - "nmfs": ecm_object.nmfs - } - if ecm_data.krp: - ecms[ecm_data.krp] = ecm_data - print("Обновлен список: ") - for ecm_key in ecms: - var ecm = ecms[ecm_key] - if ecm.krp: - print("krp:", ecm.krp, "svk:", ecm.svk, "fs:", ecm.nmfs) + func interfer_uarep() -> void: + tx_stack[65] = 0 + tx_stack[66] = 0 + for ecm in ecms.values(): + if ecm.krp == "srni1" and ecm.svk == 1: + tx_stack[65] = 1 + if ecm.krp == "svi1" and ecm.svk == 1: + tx_stack[66] = 1 + tx_stack[1] = msg_counter + # Обработка указаний от Трассы по кнопке func btn_trassa_pressed() -> void: var state = ProjectSettings.get_setting('application/config/Внешнее указание Трасса', false) if state == true: if srn == 1: - tx_data[65] = 1 + tx_stack[65] = 1 signaller.emit_signal('interfer_prinuditelno', frm_ecm_list.srn_sectors) else: - tx_data[65] = 0 - + tx_stack[65] = 0 + for ecm in ecms.values(): + if ecm.krp == "srni1" and ecm.svk == 1: + ecm.krp = interfer.INTERFER_OFF + interfer.send_ecm(ecm, unit_caps) + signaller.emit_signal('interfer_off', ecm) if jtids == 1: - tx_data[66] = 1 + tx_stack[66] = 1 signaller.emit_signal('interfer_prinuditelno', frm_ecm_list.jtids_sectors) else: - tx_data[66] = 0 + tx_stack[66] = 0 + for ecm in ecms.values(): + if ecm.krp == "svi1" and ecm.svk == 1: + ecm.krp = interfer.INTERFER_OFF + interfer.send_ecm(ecm, unit_caps) + signaller.emit_signal('interfer_off', ecm) From 99e32fd985f7d6b20a7865427e8532f8d578cc74 Mon Sep 17 00:00:00 2001 From: lepshiy Date: Thu, 2 Oct 2025 12:04:08 +0300 Subject: [PATCH 10/12] =?UTF-8?q?=D0=A2=D1=80=D0=B0=D1=81=D1=81=D0=B0.=20?= =?UTF-8?q?=D0=9D=D0=B0=D0=B6=D0=B0=D1=82=D0=B8=D0=B5/=D0=BE=D1=82=D0=B6?= =?UTF-8?q?=D0=B0=D1=82=D0=B8=D0=B5=20=D0=BA=D0=BD=D0=BE=D0=BF=D0=BE=D0=BA?= =?UTF-8?q?=20=D0=B3=D1=80=D1=83=D0=BF=D0=BF=D1=8B=20=D0=BF=D1=80=D0=B8?= =?UTF-8?q?=D0=BD=D1=83=D0=B4=D0=B8=D1=82=D0=B5=D0=BB=D1=8C=D0=BD=D0=BE.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scenes/работа/работа.tscn | 2 +- scripts/trassa.gd | 22 +++++++++++++++++++--- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/scenes/работа/работа.tscn b/scenes/работа/работа.tscn index a1667359..692683ec 100644 --- a/scenes/работа/работа.tscn +++ b/scenes/работа/работа.tscn @@ -308,6 +308,6 @@ text = "Масштаб:" [connection signal="drag_continue" from="." to="." method="_on_drag_continue"] [connection signal="toggled" from="btn_view" to="." method="on_button_view_toggled"] [connection signal="toggled" from="chk_auto" to="." method="on_value_changed"] -[connection signal="toggled" from="btn_activate" to="." method="on_btn_activate"] [connection signal="toggled" from="btn_activate" to="." method="on_btn_activate_toggled"] +[connection signal="toggled" from="btn_activate" to="." method="on_btn_activate"] [connection signal="toggled" from="btn_center" to="." method="on_btn_center_toggled"] diff --git a/scripts/trassa.gd b/scripts/trassa.gd index 428e2e82..b207aa69 100644 --- a/scripts/trassa.gd +++ b/scripts/trassa.gd @@ -15,10 +15,13 @@ class Trassa extends unit.Unit: var ecms: Dictionary = {} # Словарь всех активных помех var srn = 0 var jtids = 0 - + var prinud_but: Array = [] + var forced_buttons: Array = [] # Храним ссылки на кнопки + # Инициализация - func _init(nm: StringName) -> void: + func _init(nm: StringName, buttons: Array = []) -> void: self.name = nm + self.forced_buttons = buttons tx_stack.resize(WORDS_TOTAL) tx_stack.fill(NOINFO) interfer.connect("interfer_resized", Callable(self, "on_interfer_resized")) @@ -124,9 +127,17 @@ class Trassa extends unit.Unit: # Обработка указаний от Трассы по кнопке - func btn_trassa_pressed() -> void: + func btn_trassa_pressed() -> void: var state = ProjectSettings.get_setting('application/config/Внешнее указание Трасса', false) if state == true: + var tree: SceneTree = Engine.get_main_loop() + if tree is SceneTree: + var nodes: Array = tree.get_nodes_in_group('группа-принудительно') + for btn in nodes: + if btn.name == 'btn_srn': + btn.pressed = (srn == 1) + elif btn.name == 'btn_jtids': + btn.pressed = (jtids == 1) if srn == 1: tx_stack[65] = 1 signaller.emit_signal('interfer_prinuditelno', frm_ecm_list.srn_sectors) @@ -147,3 +158,8 @@ class Trassa extends unit.Unit: ecm.krp = interfer.INTERFER_OFF interfer.send_ecm(ecm, unit_caps) signaller.emit_signal('interfer_off', ecm) + for ecm in ecms.values(): + if ecm.krp == "svi1" and ecm.svk == 1: + ecm.krp = interfer.INTERFER_OFF + interfer.send_ecm(ecm, unit_caps) + signaller.emit_signal('interfer_off', ecm) From 78c9a0b5a78f6b8271a4474367eeb5d3b95ce501 Mon Sep 17 00:00:00 2001 From: lepshiy Date: Fri, 24 Oct 2025 12:01:51 +0300 Subject: [PATCH 11/12] =?UTF-8?q?=D0=94=D0=B2=D0=B8=D0=B6=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5=20=D0=BA=D0=BE=D1=80=D0=B0=D0=B1=D0=BB=D0=B8=D0=BA?= =?UTF-8?q?=D0=B0=20=D0=BF=D0=BE=20=D0=BA=D0=BE=D0=BE=D1=80=D0=B4=D0=B8?= =?UTF-8?q?=D0=BD=D0=B0=D1=82=D0=B0=D0=BC.=20=D0=AD=D0=BA=D1=80=D0=B0?= =?UTF-8?q?=D0=BD=20=D0=AD=D0=9C=D0=A1=20=D0=A2=D0=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scenes/tilemap/ship_mark.tscn | 1 - scenes/tilemap/tilemap.gd | 22 +- scenes/работа/работа.tscn | 10 +- scenes/эмс2/эмс2.tscn | 1471 ++++++++++++++++++++++++++------- 4 files changed, 1172 insertions(+), 332 deletions(-) diff --git a/scenes/tilemap/ship_mark.tscn b/scenes/tilemap/ship_mark.tscn index 096387d0..888ea823 100644 --- a/scenes/tilemap/ship_mark.tscn +++ b/scenes/tilemap/ship_mark.tscn @@ -3,7 +3,6 @@ [ext_resource type="Texture2D" uid="uid://cj1f2uy6qfvki" path="res://scenes/tilemap/23900.png" id="1_v0nwa"] [node name="23900" type="Sprite2D"] -position = Vector2(0.0, 0.0) rotation = 4.71239 scale = Vector2(0.496934, 0.496934) texture = ExtResource("1_v0nwa") diff --git a/scenes/tilemap/tilemap.gd b/scenes/tilemap/tilemap.gd index d546a2f8..383be97f 100644 --- a/scenes/tilemap/tilemap.gd +++ b/scenes/tilemap/tilemap.gd @@ -5,6 +5,7 @@ class_name MercatorTileMap ## Отображение карт WEB Mercator #http://10.1.1.220/osm_tiles/0/0/0.png +#http://169.254.27.71:8001/osm_tiles/{z}/{x}/{y}.png #https://tile.openstreetmap.org/{z}/{x}/{y}.png @export var base_url: String = 'https://tile.openstreetmap.org/{z}/{x}/{y}.png': set(v): @@ -146,11 +147,12 @@ func _ready() -> void: signaller.connect('map_centered', on_map_centered) if not Engine.is_editor_hint(): var unit_nav = network.get_unit_instance('навигация') - unit_nav.connect('data_received', on_data_received) + unit_nav.connect('data_received', Callable(self, 'on_data_received')) ProjectSettings.connect('settings_changed', _settings_changed) threats.connect('threat_new', Callable(self, '_on_threat_new')) threats.connect('threat_lost', Callable(self, '_on_threat_lost')) threats.connect('threat_update', Callable(self, '_on_threat_update')) + func _settings_changed(): @@ -194,7 +196,7 @@ func add_mark_from_lon_lat(id: int, lon: float, lat: float, mark: Node, gap_size if _marks.has(id): return false var wrld_pos: Vector2 = lonlat_to_world(lon, lat) - _marks[id] = {'position': wrld_pos, 'mark': mark, 'gap_size': gap_size} + _marks[id] = {'id': id, 'position': wrld_pos, 'mark': mark, 'gap_size': gap_size} # Добавляем ID add_child(mark) queue_redraw() return true @@ -292,20 +294,15 @@ func _draw() -> void: for tx in range(t1.x, t2.x): for ty in range(t1.y, t2.y): _draw_tile(tx, ty, z) - # Рисование отметок - var n: = pow(2, z) - var dx: = n * tile_width var c: Vector2 = $canvas.size / 2.0 var r: float = c.length() visible_marks_count = 0 for dot in _marks.values(): - var scr_pos: Vector2 = world_to_screen(dot.position) - scr_pos.x = posmod(int(scr_pos.x), int(dx)) - dot.mark.position = scr_pos + var screen_pos = world_to_screen(dot.position) + dot.mark.position = screen_pos dot.mark.visible = is_mark_visible(dot) - dot.mark.visible = c.distance_to(scr_pos) < (r - dot.gap_size) + dot.mark.visible = c.distance_to(screen_pos) < (r - dot.gap_size) visible_marks_count += int(dot.mark.visible) - # Рисование границ var p1: Vector2 = $canvas.position var p2: Vector2 = $canvas.size / Vector2(1, 20) if is_out_border1 and _dragging: @@ -313,7 +310,6 @@ func _draw() -> void: p1.y = p1.y + $canvas.size.y - p2.y if is_out_border2 and _dragging: draw_texture_rect(border2, Rect2(p1, p2), false, Color.WHITE, false) - if should_draw_ship_radius(): draw_ship_radius() @@ -710,8 +706,8 @@ func set_coordinates(lon: float, lat: float, course: float) -> void: ship_instance = ship_mark.instantiate() add_mark_from_lon_lat(ship_id, lon, lat, ship_instance, 0.0) else: - ship_instance.position = lonlat_to_world(lon, lat) - ship_instance.rotation_degrees = course - 90 + _marks[ship_id].position = lonlat_to_world(lon, lat) + queue_redraw() func blend_mask(val: bool) -> void: diff --git a/scenes/работа/работа.tscn b/scenes/работа/работа.tscn index 0e89ccb0..4d4e5faf 100644 --- a/scenes/работа/работа.tscn +++ b/scenes/работа/работа.tscn @@ -178,7 +178,7 @@ size_flags_vertical = 3 tooltip_text = "Кнопка для выбора сектора при помощи клика мышкой" strips_rotation = 25.0 text = "Строб" -font_size = 1 +font_size = 15 metadata/state = 0 [node name="btn_threats" parent="btns_select" groups=["группа-режим-выбора"] instance=ExtResource("8_k0iv2")] @@ -188,7 +188,7 @@ size_flags_vertical = 3 tooltip_text = "Кнопка для выбора сектора при помощи клика мышкой" strips_rotation = 25.0 text = "Цель" -font_size = 1 +font_size = 15 metadata/state = 1 [node name="btn_fs_sector" parent="btns_select" groups=["группа-режим-выбора"] instance=ExtResource("8_k0iv2")] @@ -198,7 +198,7 @@ size_flags_vertical = 3 tooltip_text = "Кнопка для выбора сектора при помощи клика мышкой" strips_rotation = 25.0 text = "Сектор" -font_size = 1 +font_size = 15 metadata/state = 2 [node name="chk_auto" type="CheckBox" parent="."] @@ -345,11 +345,11 @@ text = "−" [connection signal="drag_continue" from="." to="." method="_on_drag_continue"] [connection signal="toggled" from="btn_view" to="." method="on_button_view_toggled"] [connection signal="toggled" from="chk_auto" to="." method="on_value_changed"] -[connection signal="toggled" from="btn_activate" to="." method="on_btn_activate_toggled"] [connection signal="toggled" from="btn_activate" to="." method="on_btn_activate"] +[connection signal="toggled" from="btn_activate" to="." method="on_btn_activate_toggled"] [connection signal="toggled" from="btn_center" to="." method="on_btn_center_toggled"] [connection signal="button_down" from="zoom_plus" to="tilemap" method="_on_zoom_plus_button_down"] -[connection signal="button_up" from="zoom_plus" to="tilemap" method="_on_zoom_plus_button_up"] [connection signal="button_up" from="zoom_plus" to="tilemap" method="_on_zoom_button_up"] +[connection signal="button_up" from="zoom_plus" to="tilemap" method="_on_zoom_plus_button_up"] [connection signal="button_down" from="zoom_minus" to="tilemap" method="_on_zoom_minus_button_down"] [connection signal="button_up" from="zoom_minus" to="tilemap" method="_on_zoom_button_up"] diff --git a/scenes/эмс2/эмс2.tscn b/scenes/эмс2/эмс2.tscn index 06f453bc..ae3232bd 100644 --- a/scenes/эмс2/эмс2.tscn +++ b/scenes/эмс2/эмс2.tscn @@ -1,345 +1,1190 @@ -[gd_scene load_steps=2 format=3 uid="uid://musb21x2u0xs"] +[gd_scene load_steps=34 format=3 uid="uid://musb21x2u0xs"] -[ext_resource type="Texture2D" uid="uid://co5xj5uhjfk84" path="res://data/Окно.png" id="1_k6k6b"] +[ext_resource type="Texture2D" uid="uid://hkcvl2waf63s" path="res://scenes/эмс2/вид сверху.png" id="1_b7vcf"] +[ext_resource type="Texture2D" uid="uid://0w6q4vfst0ry" path="res://scenes/эмс2/OP-63.png" id="3_8gk36"] +[ext_resource type="Texture2D" uid="uid://coxhivvc6uibs" path="res://scenes/эмс2/Состояние РЭС 40.png" id="4_b3mus"] +[ext_resource type="Texture2D" uid="uid://073el51yholj" path="res://scenes/эмс2/454.png" id="4_nqi0i"] +[ext_resource type="Texture2D" uid="uid://cckk3jk5r32bh" path="res://scenes/эмс2/ГО.png" id="5_e7tlv"] +[ext_resource type="Texture2D" uid="uid://bu88bqq7hrotv" path="res://scenes/эмс2/Состояние РЭС 20.png" id="5_yqn2y"] +[ext_resource type="Texture2D" uid="uid://di30dfvbbdnms" path="res://scenes/эмс2/Состояние РЭС 1.png" id="6_m57px"] +[ext_resource type="Texture2D" uid="uid://kyrnn1mqpc08" path="res://scenes/эмс2/РЛС1.png" id="6_y58bl"] +[ext_resource type="Texture2D" uid="uid://cx0f3wcx76u1k" path="res://scenes/эмс2/РЛС2.png" id="7_mxw8g"] +[ext_resource type="Texture2D" uid="uid://duu8q7sv0jwfh" path="res://scenes/эмс2/ННВС.png" id="8_q16jd"] +[ext_resource type="Texture2D" uid="uid://c1nld5t17kws3" path="res://scenes/эмс2/Состояние ЭМС слабый сигнал.png" id="9_5u4bk"] +[ext_resource type="Texture2D" uid="uid://djv8fkddcjucs" path="res://scenes/эмс2/Скруглённый квадрат белый.png" id="15_2spgl"] +[ext_resource type="Texture2D" uid="uid://hd76uw2shjtn" path="res://scenes/эмс2/Угловой квадрат2.png" id="16_b5v2s"] +[ext_resource type="Texture2D" uid="uid://d3qui21aom1ac" path="res://scenes/эмс2/Квадрат марс 454.png" id="17_p41nv"] +[ext_resource type="Texture2D" uid="uid://cxrggrvx6l22q" path="res://scenes/эмс2/Квадрат марс ОР-63.png" id="18_5ifkb"] +[ext_resource type="Texture2D" uid="uid://by6a12oahbg82" path="res://scenes/эмс2/Квадрат марс РЛС1.png" id="19_vyjnq"] +[ext_resource type="Texture2D" uid="uid://dwgqofj6yae1v" path="res://scenes/эмс2/Квадрат марс РЛС2.png" id="20_68srw"] +[ext_resource type="Texture2D" uid="uid://36xjgea2n22q" path="res://scenes/эмс2/Квадрат марс ГО.png" id="21_v6otu"] +[ext_resource type="Texture2D" uid="uid://dsuiytxdnole7" path="res://scenes/эмс2/Квадрат марс с трубкой.png" id="22_ufy3d"] +[ext_resource type="Texture2D" uid="uid://b1kuhj03yigih" path="res://scenes/эмс2/Квадрат салатный 454.png" id="23_h11e0"] +[ext_resource type="Texture2D" uid="uid://d3v1r4r62na8" path="res://scenes/эмс2/Квадрат салатный ОР-63.png" id="24_2pcsf"] +[ext_resource type="Texture2D" uid="uid://ddm55bo28sxcs" path="res://scenes/эмс2/Квадрат салатный РЛС1.png" id="25_wmu4u"] +[ext_resource type="Texture2D" uid="uid://dneqjcul4ipub" path="res://scenes/эмс2/Квадрат салатный РЛС2.png" id="26_w5eif"] +[ext_resource type="Texture2D" uid="uid://cyb60nh23ys6k" path="res://scenes/эмс2/Квадрат салатный ГО.png" id="27_2ft3r"] +[ext_resource type="Texture2D" uid="uid://cw8sd7v5f31ww" path="res://scenes/эмс2/Квадрат салатный с трубкой.png" id="28_rra4y"] +[ext_resource type="Texture2D" uid="uid://busl8rb38lis" path="res://scenes/эмс2/Скруглённый прямоуг салатный.png" id="29_5u4bk"] +[ext_resource type="Texture2D" uid="uid://xux3mch12733" path="res://scenes/эмс2/Приём.png" id="30_l3ueu"] +[ext_resource type="Texture2D" uid="uid://bw2sx5d0mcu53" path="res://scenes/эмс2/Излучение.png" id="31_2spgl"] +[ext_resource type="Texture2D" uid="uid://7ody4v7qy36g" path="res://scenes/эмс2/Скруглённый прямоугольник серый.png" id="31_b5v2s"] +[ext_resource type="Texture2D" uid="uid://carr8bw5rwiwj" path="res://scenes/эмс2/Кнопка подтверждения01.png" id="32_p41nv"] +[ext_resource type="Texture2D" uid="uid://3siondd3feev" path="res://scenes/эмс2/Скруглённый прямоугольник белый.png" id="33_5ifkb"] -[node name="ЭМС2" type="Panel"] +[sub_resource type="CompressedTexture2D" id="CompressedTexture2D_5u4bk"] +load_path = "res://.godot/imported/Окно частот0.png-6b01791c971bddb01337caf9077bf060.ctex" -[node name="TextureRect2" type="TextureRect" parent="."] +[sub_resource type="CompressedTexture2D" id="CompressedTexture2D_l3ueu"] +load_path = "res://.godot/imported/Скруглённый квадрат серый.png-4655829309cca3b1dec2c9ae01376d54.ctex" + +[node name="Panel" type="Panel"] + +[node name="Sprite2D" type="Sprite2D" parent="."] +modulate = Color(1, 0.596078, 0.4, 1) +position = Vector2(792, 120) +rotation = 1.5708 +scale = Vector2(0.325, 0.325) +texture = ExtResource("1_b7vcf") + +[node name="частоты" type="TextureRect" parent="."] layout_mode = 0 -offset_top = 8.0 -offset_right = 1597.0 -offset_bottom = 712.0 -texture = ExtResource("1_k6k6b") +offset_left = 32.0 +offset_top = 240.0 +offset_right = 1649.0 +offset_bottom = 813.0 +scale = Vector2(0.95, 0.95) +texture = SubResource("CompressedTexture2D_5u4bk") +expand_mode = 1 -[node name="Label2" type="Label" parent="TextureRect2"] +[node name="Op-63" type="TextureRect" parent="."] layout_mode = 0 -offset_left = 795.0 -offset_top = 8.0 -offset_right = 868.0 -offset_bottom = 27.0 -theme_override_colors/font_color = Color(0, 0, 0, 1) -text = "Излучение" +offset_left = 152.0 +offset_top = 84.0 +offset_right = 365.0 +offset_bottom = 376.0 +scale = Vector2(0.312207, 0.312207) +texture = ExtResource("3_8gk36") -[node name="Label3" type="Label" parent="TextureRect2"] +[node name="СостояниеРэс44" type="Sprite2D" parent="Op-63"] +position = Vector2(277.772, 259.444) +scale = Vector2(1.77945, 1.77945) +texture = ExtResource("4_b3mus") + +[node name="СостояниеРэс24" type="Sprite2D" parent="Op-63"] +position = Vector2(277.772, 192.18) +scale = Vector2(1.77945, 1.77945) +texture = ExtResource("5_yqn2y") + +[node name="СостояниеРэс2" type="Sprite2D" parent="Op-63"] +position = Vector2(281.865, 35.2331) +scale = Vector2(3.20301, 3.20301) +texture = ExtResource("6_m57px") + +[node name="454" type="TextureRect" parent="."] layout_mode = 0 -offset_left = 813.0 -offset_top = 293.0 -offset_right = 864.0 -offset_bottom = 312.0 -theme_override_colors/font_color = Color(0, 0, 0, 1) -text = "Приём" +offset_left = 304.0 +offset_top = 84.0 +offset_right = 517.0 +offset_bottom = 376.0 +scale = Vector2(0.312, 0.312) +texture = ExtResource("4_nqi0i") -[node name="RichTextLabel" type="RichTextLabel" parent="TextureRect2"] +[node name="СостояниеРэс45" type="Sprite2D" parent="454"] +position = Vector2(277.956, 259.615) +scale = Vector2(1.78063, 1.78063) +texture = ExtResource("4_b3mus") + +[node name="СостояниеРэс25" type="Sprite2D" parent="454"] +position = Vector2(277.956, 192.308) +scale = Vector2(1.78063, 1.78063) +texture = ExtResource("5_yqn2y") + +[node name="СостояниеРэс3" type="Sprite2D" parent="454"] +position = Vector2(275.641, 38.4615) +scale = Vector2(3.20513, 3.20513) +texture = ExtResource("6_m57px") + +[node name="Го" type="TextureRect" parent="."] layout_mode = 0 -offset_left = 11.0 -offset_top = 36.0 -offset_right = 126.0 -offset_bottom = 286.0 +offset_left = 488.0 +offset_top = 85.0 +offset_right = 701.0 +offset_bottom = 377.0 +scale = Vector2(0.312, 0.312) +texture = ExtResource("5_e7tlv") -[node name="RichTextLabel2" type="RichTextLabel" parent="TextureRect2"] -layout_mode = 0 -offset_left = 12.0 -offset_top = 318.0 -offset_right = 127.0 -offset_bottom = 568.0 +[node name="СостояниеРэс40" type="Sprite2D" parent="Го"] +position = Vector2(278.045, 253.205) +scale = Vector2(1.78063, 1.78063) +texture = ExtResource("4_b3mus") -[node name="GridContainer2" type="GridContainer" parent="."] -modulate = Color(0.8, 0.533333, 0.27451, 1) -self_modulate = Color(0.8, 0.533333, 0.27451, 1) -layout_mode = 0 -offset_left = -8.0 -offset_top = 840.0 -offset_right = 1592.0 -offset_bottom = 1208.0 +[node name="СостояниеРэс20" type="Sprite2D" parent="Го"] +position = Vector2(278.045, 185.897) +scale = Vector2(1.78063, 1.78063) +texture = ExtResource("5_yqn2y") -[node name="Label11" type="Label" parent="."] -layout_mode = 0 -offset_left = 1224.0 -offset_top = 752.0 -offset_right = 3304.0 -offset_bottom = 1872.0 -scale = Vector2(0.05, 0.05) -theme_override_colors/font_color = Color(0, 0, 0, 1) -theme_override_font_sizes/font_size = 350 -text = "Запрет -приёма" -horizontal_alignment = 1 -vertical_alignment = 1 +[node name="СостояниеЭмсСлабыйСигнал" type="Sprite2D" parent="Го"] +position = Vector2(278.045, 118.59) +scale = Vector2(3.37683, 3.20513) +texture = ExtResource("9_5u4bk") -[node name="ColorRect2" type="ColorRect" parent="Label11"] -modulate = Color(0.8, 0.533333, 0.27451, 1) -show_behind_parent = true -layout_mode = 1 -anchors_preset = -1 -anchor_right = 1.0 -anchor_bottom = 1.0 -offset_bottom = 1.0 -grow_horizontal = 2 -grow_vertical = 2 - -[node name="Label14" type="Label" parent="."] -layout_mode = 0 -offset_left = 1336.0 -offset_top = 752.0 -offset_right = 3736.0 -offset_bottom = 1872.0 -scale = Vector2(0.05, 0.05) -theme_override_colors/font_color = Color(0, 0, 0, 1) -theme_override_font_sizes/font_size = 350 -text = "Исполнено" -horizontal_alignment = 1 -vertical_alignment = 1 - -[node name="ColorRect2" type="ColorRect" parent="Label14"] -modulate = Color(0.8, 0.533333, 0.27451, 1) -show_behind_parent = true -layout_mode = 1 -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -grow_horizontal = 2 -grow_vertical = 2 - -[node name="Label12" type="Label" parent="."] -layout_mode = 0 -offset_left = 1464.0 -offset_top = 752.0 -offset_right = 3704.0 -offset_bottom = 1872.0 -scale = Vector2(0.05, 0.05) -theme_override_colors/font_color = Color(0, 0, 0, 1) -theme_override_font_sizes/font_size = 350 -text = "Запрет -приёма" -horizontal_alignment = 1 -vertical_alignment = 1 - -[node name="ColorRect2" type="ColorRect" parent="Label12"] -modulate = Color(0.8, 0.533333, 0.27451, 1) -show_behind_parent = true -layout_mode = 1 -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -grow_horizontal = 2 -grow_vertical = 2 - -[node name="Label15" type="Label" parent="."] -layout_mode = 0 -offset_left = 1096.0 -offset_top = 752.0 -offset_right = 3496.0 -offset_bottom = 1872.0 -scale = Vector2(0.05, 0.05) -theme_override_colors/font_color = Color(0, 0, 0, 1) -theme_override_font_sizes/font_size = 350 -text = "Исполнено" -horizontal_alignment = 1 -vertical_alignment = 1 - -[node name="ColorRect2" type="ColorRect" parent="Label15"] -modulate = Color(0.8, 0.533333, 0.27451, 1) -show_behind_parent = true -layout_mode = 1 -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -grow_horizontal = 2 -grow_vertical = 2 - -[node name="Label13" type="Label" parent="."] -layout_mode = 0 -offset_left = 976.0 -offset_top = 752.0 -offset_right = 3216.0 -offset_bottom = 1872.0 -scale = Vector2(0.05, 0.05) -theme_override_colors/font_color = Color(0, 0, 0, 1) -theme_override_font_sizes/font_size = 350 -text = "Верхняя -Частота" -horizontal_alignment = 1 -vertical_alignment = 1 - -[node name="ColorRect2" type="ColorRect" parent="Label13"] -modulate = Color(0.8, 0.533333, 0.27451, 1) -show_behind_parent = true -layout_mode = 1 -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -grow_horizontal = 2 -grow_vertical = 2 - -[node name="Label16" type="Label" parent="."] -layout_mode = 0 -offset_left = 856.0 -offset_top = 752.0 -offset_right = 3096.0 -offset_bottom = 1872.0 -scale = Vector2(0.05, 0.05) -theme_override_colors/font_color = Color(0, 0, 0, 1) -theme_override_font_sizes/font_size = 350 -text = "Нижняя -частота" -horizontal_alignment = 1 -vertical_alignment = 1 - -[node name="ColorRect2" type="ColorRect" parent="Label16"] -modulate = Color(0.8, 0.533333, 0.27451, 1) -show_behind_parent = true -layout_mode = 1 -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -offset_left = -0.000976563 -offset_right = -0.000976563 -grow_horizontal = 2 -grow_vertical = 2 - -[node name="Label17" type="Label" parent="."] +[node name="Рлс1" type="TextureRect" parent="."] layout_mode = 0 offset_left = 728.0 -offset_top = 752.0 -offset_right = 3128.0 -offset_bottom = 1872.0 -scale = Vector2(0.05, 0.05) -theme_override_colors/font_color = Color(0, 0, 0, 1) -theme_override_font_sizes/font_size = 350 -text = "Кластер" -horizontal_alignment = 1 -vertical_alignment = 1 +offset_top = 83.0 +offset_right = 941.0 +offset_bottom = 375.0 +scale = Vector2(0.312, 0.312) +texture = ExtResource("6_y58bl") -[node name="ColorRect2" type="ColorRect" parent="Label17"] -modulate = Color(0.8, 0.533333, 0.27451, 1) -show_behind_parent = true -layout_mode = 1 -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -grow_horizontal = 2 -grow_vertical = 2 +[node name="СостояниеРэс41" type="Sprite2D" parent="Рлс1"] +position = Vector2(278.045, 259.615) +scale = Vector2(1.78063, 1.78063) +texture = ExtResource("4_b3mus") -[node name="Label18" type="Label" parent="."] +[node name="СостояниеРэс21" type="Sprite2D" parent="Рлс1"] +position = Vector2(278.045, 192.308) +scale = Vector2(1.78063, 1.78063) +texture = ExtResource("5_yqn2y") + +[node name="СостояниеЭмсСлабыйСигнал2" type="Sprite2D" parent="Рлс1"] +position = Vector2(278.045, 125) +scale = Vector2(3.37683, 3.20513) +texture = ExtResource("9_5u4bk") + +[node name="Рлс2" type="TextureRect" parent="."] layout_mode = 0 -offset_left = 600.0 -offset_top = 752.0 -offset_right = 3000.0 -offset_bottom = 1872.0 -scale = Vector2(0.05, 0.05) -theme_override_colors/font_color = Color(0, 0, 0, 1) -theme_override_font_sizes/font_size = 350 -text = "Угол места" -horizontal_alignment = 1 -vertical_alignment = 1 +offset_left = 920.0 +offset_top = 83.0 +offset_right = 1133.0 +offset_bottom = 375.0 +scale = Vector2(0.312, 0.312) +texture = ExtResource("7_mxw8g") -[node name="ColorRect2" type="ColorRect" parent="Label18"] -modulate = Color(0.8, 0.533333, 0.27451, 1) -show_behind_parent = true -layout_mode = 1 -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -grow_horizontal = 2 -grow_vertical = 2 +[node name="СостояниеРэс42" type="Sprite2D" parent="Рлс2"] +position = Vector2(278.045, 259.615) +scale = Vector2(1.78063, 1.78063) +texture = ExtResource("4_b3mus") -[node name="Label19" type="Label" parent="."] +[node name="СостояниеРэс22" type="Sprite2D" parent="Рлс2"] +position = Vector2(278.045, 192.308) +scale = Vector2(1.78063, 1.78063) +texture = ExtResource("5_yqn2y") + +[node name="СостояниеЭмсСлабыйСигнал3" type="Sprite2D" parent="Рлс2"] +position = Vector2(278.045, 125) +scale = Vector2(3.37683, 3.20513) +texture = ExtResource("9_5u4bk") + +[node name="Ннвс" type="TextureRect" parent="."] layout_mode = 0 -offset_left = 472.0 -offset_top = 752.0 -offset_right = 2872.0 -offset_bottom = 1872.0 -scale = Vector2(0.05, 0.05) -theme_override_colors/font_color = Color(0, 0, 0, 1) -theme_override_font_sizes/font_size = 350 -text = "Азимут" -horizontal_alignment = 1 -vertical_alignment = 1 +offset_left = 1240.0 +offset_top = 88.0 +offset_right = 1453.0 +offset_bottom = 380.0 +scale = Vector2(0.312, 0.312) +texture = ExtResource("8_q16jd") -[node name="ColorRect2" type="ColorRect" parent="Label19"] -modulate = Color(0.8, 0.533333, 0.27451, 1) -show_behind_parent = true -layout_mode = 1 -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -offset_left = 0.000610352 -offset_top = 6.10352e-05 -offset_right = 0.000488281 -grow_horizontal = 2 -grow_vertical = 2 +[node name="СостояниеРэс43" type="Sprite2D" parent="Ннвс"] +position = Vector2(277.956, 253.205) +scale = Vector2(1.78063, 1.78063) +texture = ExtResource("4_b3mus") -[node name="Label20" type="Label" parent="."] +[node name="СостояниеРэс23" type="Sprite2D" parent="Ннвс"] +position = Vector2(277.956, 185.897) +scale = Vector2(1.78063, 1.78063) +texture = ExtResource("5_yqn2y") + +[node name="УгловойКвадрат2" type="Sprite2D" parent="."] +position = Vector2(1250, 824) +texture = ExtResource("16_b5v2s") + +[node name="КвадратМарс454" type="Sprite2D" parent="УгловойКвадрат2"] +position = Vector2(0, 49) +texture = ExtResource("17_p41nv") + +[node name="КвадратМарсОр-63" type="Sprite2D" parent="УгловойКвадрат2"] +position = Vector2(0, 98) +texture = ExtResource("18_5ifkb") + +[node name="КвадратМарсРлс1" type="Sprite2D" parent="УгловойКвадрат2"] +position = Vector2(0, 147) +texture = ExtResource("19_vyjnq") + +[node name="КвадратМарсРлс2" type="Sprite2D" parent="УгловойКвадрат2"] +position = Vector2(0, 196) +texture = ExtResource("20_68srw") + +[node name="КвадратМарсГо" type="Sprite2D" parent="УгловойКвадрат2"] +position = Vector2(0, 245) +texture = ExtResource("21_v6otu") + +[node name="КвадратМарсСТрубкой" type="Sprite2D" parent="УгловойКвадрат2"] +position = Vector2(0, 294) +texture = ExtResource("22_ufy3d") + +[node name="КвадратСалатный454" type="Sprite2D" parent="УгловойКвадрат2"] +position = Vector2(49, 0) +texture = ExtResource("23_h11e0") + +[node name="КвадратСалатныйОр-63" type="Sprite2D" parent="УгловойКвадрат2"] +position = Vector2(98, 0) +texture = ExtResource("24_2pcsf") + +[node name="КвадратСалатныйРлс1" type="Sprite2D" parent="УгловойКвадрат2"] +position = Vector2(147, 0) +texture = ExtResource("25_wmu4u") + +[node name="КвадратСалатныйРлс2" type="Sprite2D" parent="УгловойКвадрат2"] +position = Vector2(196, 0) +texture = ExtResource("26_w5eif") + +[node name="КвадратСалатныйГо" type="Sprite2D" parent="УгловойКвадрат2"] +position = Vector2(245, 0) +texture = ExtResource("27_2ft3r") + +[node name="КвадратСалатныйСТрубкой" type="Sprite2D" parent="УгловойКвадрат2"] +position = Vector2(294, 0) +texture = ExtResource("28_rra4y") + +[node name="СкруглённыйКвадрат" type="Sprite2D" parent="."] +position = Vector2(1299, 873) +texture = SubResource("CompressedTexture2D_l3ueu") + +[node name="СкруглённыйКвадратБелый" type="Sprite2D" parent="СкруглённыйКвадрат"] +position = Vector2(0, 49) +texture = ExtResource("15_2spgl") + +[node name="СкруглённыйКвадратБелый2" type="Sprite2D" parent="СкруглённыйКвадрат"] +position = Vector2(98, 0) +texture = ExtResource("15_2spgl") + +[node name="СкруглённыйКвадратБелый3" type="Sprite2D" parent="СкруглённыйКвадрат"] +position = Vector2(49, 0) +texture = ExtResource("15_2spgl") + +[node name="СкруглённыйКвадратБелый4" type="Sprite2D" parent="СкруглённыйКвадрат"] +position = Vector2(0, 98) +texture = ExtResource("15_2spgl") + +[node name="СкруглённыйКвадратБелый5" type="Sprite2D" parent="СкруглённыйКвадрат"] +position = Vector2(49, 98) +texture = ExtResource("15_2spgl") + +[node name="СкруглённыйКвадратБелый6" type="Sprite2D" parent="СкруглённыйКвадрат"] +position = Vector2(98, 49) +texture = ExtResource("15_2spgl") + +[node name="СкруглённыйКвадратБелый7" type="Sprite2D" parent="СкруглённыйКвадрат"] +position = Vector2(147, 0) +texture = ExtResource("15_2spgl") + +[node name="СкруглённыйКвадратБелый8" type="Sprite2D" parent="СкруглённыйКвадрат"] +position = Vector2(196, 0) +texture = ExtResource("15_2spgl") + +[node name="СкруглённыйКвадратБелый9" type="Sprite2D" parent="СкруглённыйКвадрат"] +position = Vector2(245, 0) +texture = ExtResource("15_2spgl") + +[node name="СкруглённыйКвадратБелый10" type="Sprite2D" parent="СкруглённыйКвадрат"] +position = Vector2(147, 49) +texture = ExtResource("15_2spgl") + +[node name="СкруглённыйКвадратБелый11" type="Sprite2D" parent="СкруглённыйКвадрат"] +position = Vector2(196, 49) +texture = ExtResource("15_2spgl") + +[node name="СкруглённыйКвадратБелый12" type="Sprite2D" parent="СкруглённыйКвадрат"] +position = Vector2(245, 49) +texture = ExtResource("15_2spgl") + +[node name="СкруглённыйКвадратБелый13" type="Sprite2D" parent="СкруглённыйКвадрат"] +position = Vector2(147, 98) +texture = ExtResource("15_2spgl") + +[node name="СкруглённыйКвадратБелый14" type="Sprite2D" parent="СкруглённыйКвадрат"] +position = Vector2(196, 98) +texture = ExtResource("15_2spgl") + +[node name="СкруглённыйКвадратБелый15" type="Sprite2D" parent="СкруглённыйКвадрат"] +position = Vector2(245, 98) +texture = ExtResource("15_2spgl") + +[node name="СкруглённыйКвадратБелый16" type="Sprite2D" parent="СкруглённыйКвадрат"] +position = Vector2(245, 147) +texture = ExtResource("15_2spgl") + +[node name="СкруглённыйКвадратБелый17" type="Sprite2D" parent="СкруглённыйКвадрат"] +position = Vector2(0, 147) +texture = ExtResource("15_2spgl") + +[node name="СкруглённыйКвадратБелый18" type="Sprite2D" parent="СкруглённыйКвадрат"] +position = Vector2(49, 147) +texture = ExtResource("15_2spgl") + +[node name="СкруглённыйКвадратБелый19" type="Sprite2D" parent="СкруглённыйКвадрат"] +position = Vector2(98, 147) +texture = ExtResource("15_2spgl") + +[node name="СкруглённыйКвадратБелый20" type="Sprite2D" parent="СкруглённыйКвадрат"] +position = Vector2(196, 147) +texture = ExtResource("15_2spgl") + +[node name="СкруглённыйКвадратБелый21" type="Sprite2D" parent="СкруглённыйКвадрат"] +position = Vector2(0, 196) +texture = ExtResource("15_2spgl") + +[node name="СкруглённыйКвадратБелый22" type="Sprite2D" parent="СкруглённыйКвадрат"] +position = Vector2(49, 196) +texture = ExtResource("15_2spgl") + +[node name="СкруглённыйКвадратБелый23" type="Sprite2D" parent="СкруглённыйКвадрат"] +position = Vector2(98, 196) +texture = ExtResource("15_2spgl") + +[node name="СкруглённыйКвадратБелый24" type="Sprite2D" parent="СкруглённыйКвадрат"] +position = Vector2(147, 196) +texture = ExtResource("15_2spgl") + +[node name="СкруглённыйКвадратБелый25" type="Sprite2D" parent="СкруглённыйКвадрат"] +position = Vector2(0, 245) +texture = ExtResource("15_2spgl") + +[node name="СкруглённыйКвадратБелый26" type="Sprite2D" parent="СкруглённыйКвадрат"] +position = Vector2(49, 245) +texture = ExtResource("15_2spgl") + +[node name="СкруглённыйКвадратБелый27" type="Sprite2D" parent="СкруглённыйКвадрат"] +position = Vector2(98, 245) +texture = ExtResource("15_2spgl") + +[node name="СкруглённыйКвадратБелый28" type="Sprite2D" parent="СкруглённыйКвадрат"] +position = Vector2(147, 245) +texture = ExtResource("15_2spgl") + +[node name="СкруглённыйКвадратБелый29" type="Sprite2D" parent="СкруглённыйКвадрат"] +position = Vector2(196, 245) +texture = ExtResource("15_2spgl") + +[node name="СкруглённыйКвадратБелый30" type="Sprite2D" parent="СкруглённыйКвадрат"] +position = Vector2(245, 196) +texture = ExtResource("15_2spgl") + +[node name="СкруглённыйКвадратСерый2" type="Sprite2D" parent="СкруглённыйКвадрат"] +position = Vector2(49, 49) +texture = SubResource("CompressedTexture2D_l3ueu") + +[node name="СкруглённыйКвадратСерый3" type="Sprite2D" parent="СкруглённыйКвадрат"] +position = Vector2(98, 98) +texture = SubResource("CompressedTexture2D_l3ueu") + +[node name="СкруглённыйКвадратСерый4" type="Sprite2D" parent="СкруглённыйКвадрат"] +position = Vector2(147, 147) +texture = SubResource("CompressedTexture2D_l3ueu") + +[node name="СкруглённыйКвадратСерый5" type="Sprite2D" parent="СкруглённыйКвадрат"] +position = Vector2(245, 245) +texture = SubResource("CompressedTexture2D_l3ueu") + +[node name="СкруглённыйКвадратСерый6" type="Sprite2D" parent="СкруглённыйКвадрат"] +position = Vector2(196, 196) +texture = SubResource("CompressedTexture2D_l3ueu") + +[node name="Label" type="Label" parent="."] layout_mode = 0 -offset_left = 344.0 -offset_top = 752.0 -offset_right = 2744.0 -offset_bottom = 1872.0 -scale = Vector2(0.05, 0.05) +offset_left = 800.0 +offset_top = 246.0 +offset_right = 873.0 +offset_bottom = 265.0 theme_override_colors/font_color = Color(0, 0, 0, 1) -theme_override_font_sizes/font_size = 350 -text = "Режим" -horizontal_alignment = 1 -vertical_alignment = 1 +theme_override_font_sizes/font_size = 16 +text = "Излучение" -[node name="ColorRect2" type="ColorRect" parent="Label20"] -modulate = Color(0.8, 0.533333, 0.27451, 1) -show_behind_parent = true -layout_mode = 1 -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -offset_left = 0.000610352 -offset_top = 6.10352e-05 -offset_right = 0.000488281 -grow_horizontal = 2 -grow_vertical = 2 - -[node name="Label21" type="Label" parent="."] -layout_mode = 0 -offset_left = 216.0 -offset_top = 752.0 -offset_right = 2616.0 -offset_bottom = 1872.0 -scale = Vector2(0.05, 0.05) +[node name="Label2" type="Label" parent="."] +offset_left = 813.0 +offset_top = 503.0 +offset_right = 861.0 +offset_bottom = 522.0 +theme_override_colors/font_color = Color(0, 0, 0, 1) +theme_override_font_sizes/font_size = 16 +text = "Приём" + +[node name="СкруглённыйПрямоугСалатный" type="Sprite2D" parent="."] +position = Vector2(84, 828) +scale = Vector2(1.33333, 1.16667) +texture = ExtResource("29_5u4bk") + +[node name="СкруглённыйПрямоугСалатный4" type="Sprite2D" parent="СкруглённыйПрямоугСалатный"] +position = Vector2(660, 0) +scale = Vector2(1, 1) +texture = ExtResource("29_5u4bk") + +[node name="СкруглённыйПрямоугСалатный5" type="Sprite2D" parent="СкруглённыйПрямоугСалатный"] +position = Vector2(774, 0) +scale = Vector2(1, 1) +texture = ExtResource("29_5u4bk") + +[node name="СкруглённыйПрямоугСалатный6" type="Sprite2D" parent="СкруглённыйПрямоугСалатный"] +position = Vector2(546, 0) +scale = Vector2(1, 1) +texture = ExtResource("29_5u4bk") + +[node name="СкруглённыйПрямоугСалатный7" type="Sprite2D" parent="СкруглённыйПрямоугСалатный"] +position = Vector2(468, 0) +scale = Vector2(1, 1) +texture = ExtResource("29_5u4bk") + +[node name="СкруглённыйПрямоугСалатный8" type="Sprite2D" parent="СкруглённыйПрямоугСалатный"] +position = Vector2(390, 0) +scale = Vector2(1, 1) +texture = ExtResource("29_5u4bk") + +[node name="СкруглённыйПрямоугСалатный9" type="Sprite2D" parent="СкруглённыйПрямоугСалатный"] +position = Vector2(312, 0) +scale = Vector2(1, 1) +texture = ExtResource("29_5u4bk") + +[node name="СкруглённыйПрямоугСалатный10" type="Sprite2D" parent="СкруглённыйПрямоугСалатный"] +position = Vector2(234, 0) +scale = Vector2(1, 1) +texture = ExtResource("29_5u4bk") + +[node name="СкруглённыйПрямоугСалатный11" type="Sprite2D" parent="СкруглённыйПрямоугСалатный"] +position = Vector2(156, 0) +scale = Vector2(1, 1) +texture = ExtResource("29_5u4bk") + +[node name="СкруглённыйПрямоугСалатный12" type="Sprite2D" parent="СкруглённыйПрямоугСалатный"] +position = Vector2(78, 0) +scale = Vector2(1, 1) +texture = ExtResource("29_5u4bk") + +[node name="Приём" type="Sprite2D" parent="СкруглённыйПрямоугСалатный"] +position = Vector2(717, 0) +scale = Vector2(0.75, 1) +texture = ExtResource("30_l3ueu") + +[node name="Излучение" type="Sprite2D" parent="СкруглённыйПрямоугСалатный"] +position = Vector2(603, 0) +scale = Vector2(0.75, 1) +texture = ExtResource("31_2spgl") + +[node name="Label2" type="Label" parent="СкруглённыйПрямоугСалатный"] +offset_left = 48.75 +offset_top = -10.2857 +offset_right = 108.75 +offset_bottom = 8.7143 theme_override_colors/font_color = Color(0, 0, 0, 1) -theme_override_font_sizes/font_size = 350 text = "Изделие" -horizontal_alignment = 1 -vertical_alignment = 1 -[node name="ColorRect2" type="ColorRect" parent="Label21"] -modulate = Color(0.8, 0.533333, 0.27451, 1) -show_behind_parent = true -layout_mode = 1 -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -offset_top = 6.10352e-05 -grow_horizontal = 2 -grow_vertical = 2 - -[node name="Label22" type="Label" parent="."] -layout_mode = 0 -offset_left = 88.0 -offset_top = 752.0 -offset_right = 2488.0 -offset_bottom = 1872.0 -scale = Vector2(0.05, 0.05) +[node name="Label" type="Label" parent="СкруглённыйПрямоугСалатный"] +offset_left = -33.0 +offset_top = -10.2857 +offset_right = 35.0 +offset_bottom = 8.71429 theme_override_colors/font_color = Color(0, 0, 0, 1) -theme_override_font_sizes/font_size = 350 -text = "Комплекс -" -horizontal_alignment = 1 -vertical_alignment = 1 +text = "Комплекс" -[node name="ColorRect2" type="ColorRect" parent="Label22"] -modulate = Color(0.8, 0.533333, 0.27451, 1) -show_behind_parent = true -layout_mode = 1 -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -offset_top = 6.10352e-05 -grow_horizontal = 2 -grow_vertical = 2 +[node name="Label3" type="Label" parent="СкруглённыйПрямоугСалатный"] +offset_left = 133.0 +offset_top = -10.0 +offset_right = 180.0 +offset_bottom = 9.0 +theme_override_colors/font_color = Color(0, 0, 0, 1) +text = "Режим" + +[node name="Label4" type="Label" parent="СкруглённыйПрямоугСалатный"] +offset_left = 209.25 +offset_top = -10.2857 +offset_right = 258.25 +offset_bottom = 8.7143 +theme_override_colors/font_color = Color(0, 0, 0, 1) +text = "Азимут" + +[node name="Label5" type="Label" parent="СкруглённыйПрямоугСалатный"] +offset_left = 627.0 +offset_top = -20.5713 +offset_right = 693.0 +offset_bottom = 20.4287 +theme_override_colors/font_color = Color(0, 0, 0, 1) +text = "Запрет +передачи" +horizontal_alignment = 1 + +[node name="Label6" type="Label" parent="СкруглённыйПрямоугСалатный"] +offset_left = 516.75 +offset_top = -10.2857 +offset_right = 574.75 +offset_bottom = 8.7143 +theme_override_colors/font_color = Color(0, 0, 0, 1) +text = "Верхняя" + +[node name="Label7" type="Label" parent="СкруглённыйПрямоугСалатный"] +offset_left = 441.0 +offset_top = -10.2857 +offset_right = 495.0 +offset_bottom = 8.7143 +theme_override_colors/font_color = Color(0, 0, 0, 1) +text = "Нижняя" + +[node name="Label8" type="Label" parent="СкруглённыйПрямоугСалатный"] +offset_left = 362.25 +offset_top = -10.2857 +offset_right = 418.25 +offset_bottom = 8.7143 +theme_override_colors/font_color = Color(0, 0, 0, 1) +text = "Кластер" + +[node name="Label9" type="Label" parent="СкруглённыйПрямоугСалатный"] +offset_left = 275.25 +offset_top = -10.2857 +offset_right = 349.25 +offset_bottom = 8.7143 +theme_override_colors/font_color = Color(0, 0, 0, 1) +text = "Угол места" + +[node name="Label10" type="Label" parent="СкруглённыйПрямоугСалатный"] +offset_left = 747.0 +offset_top = -20.5713 +offset_right = 801.0 +offset_bottom = 20.4287 +theme_override_colors/font_color = Color(0, 0, 0, 1) +text = "Запрет +приёма" +horizontal_alignment = 1 + +[node name="СкруглённыйПрямоугольникБелый" type="Sprite2D" parent="."] +position = Vector2(84, 871) +scale = Vector2(1.13043, 1) +texture = ExtResource("31_b5v2s") + +[node name="СкруглённыйПрямоугольникБелый2" type="Sprite2D" parent="СкруглённыйПрямоугольникБелый"] +position = Vector2(0, 29) +texture = ExtResource("31_b5v2s") + +[node name="СкруглённыйПрямоугольникБелый3" type="Sprite2D" parent="СкруглённыйПрямоугольникБелый"] +position = Vector2(0, 58) +texture = ExtResource("31_b5v2s") + +[node name="СкруглённыйПрямоугольникБелый4" type="Sprite2D" parent="СкруглённыйПрямоугольникБелый"] +position = Vector2(0, 87) +texture = ExtResource("31_b5v2s") + +[node name="СкруглённыйПрямоугольникБелый5" type="Sprite2D" parent="СкруглённыйПрямоугольникБелый"] +position = Vector2(0, 116) +texture = ExtResource("31_b5v2s") + +[node name="СкруглённыйПрямоугольникБелый6" type="Sprite2D" parent="СкруглённыйПрямоугольникБелый"] +position = Vector2(0, 145) +texture = ExtResource("31_b5v2s") + +[node name="СкруглённыйПрямоугольникБелый7" type="Sprite2D" parent="СкруглённыйПрямоугольникБелый"] +position = Vector2(0, 174) +texture = ExtResource("31_b5v2s") + +[node name="СкруглённыйПрямоугольникБелый8" type="Sprite2D" parent="СкруглённыйПрямоугольникБелый"] +position = Vector2(0, 203) +texture = ExtResource("31_b5v2s") + +[node name="СкруглённыйПрямоугольникБелый9" type="Sprite2D" parent="СкруглённыйПрямоугольникБелый"] +position = Vector2(0, 232) +texture = ExtResource("31_b5v2s") + +[node name="СкруглённыйПрямоугольникБелый10" type="Sprite2D" parent="СкруглённыйПрямоугольникБелый"] +position = Vector2(0, 261) +texture = ExtResource("31_b5v2s") + +[node name="КнопкаПодтверждения01" type="Sprite2D" parent="СкруглённыйПрямоугольникБелый"] +position = Vector2(778.683, 0.25) +scale = Vector2(1.22077, 1.28261) +texture = ExtResource("32_p41nv") + +[node name="Label3" type="Label" parent="СкруглённыйПрямоугольникБелый"] +offset_left = -31.8462 +offset_top = -10.0 +offset_right = 36.1538 +offset_bottom = 9.0 +theme_override_colors/font_color = Color(0, 0, 0, 1) +text = "--" +horizontal_alignment = 1 + +[node name="СкруглённыйПрямоугольникБелый11" type="Sprite2D" parent="СкруглённыйПрямоугольникБелый"] +position = Vector2(92, 0) +texture = ExtResource("33_5ifkb") + +[node name="СкруглённыйПрямоугольникБелый12" type="Sprite2D" parent="СкруглённыйПрямоугольникБелый"] +position = Vector2(92, 29) +texture = ExtResource("31_b5v2s") + +[node name="СкруглённыйПрямоугольникБелый13" type="Sprite2D" parent="СкруглённыйПрямоугольникБелый"] +position = Vector2(92, 58) +texture = ExtResource("33_5ifkb") + +[node name="СкруглённыйПрямоугольникБелый14" type="Sprite2D" parent="СкруглённыйПрямоугольникБелый"] +position = Vector2(92, 87) +texture = ExtResource("31_b5v2s") + +[node name="СкруглённыйПрямоугольникБелый15" type="Sprite2D" parent="СкруглённыйПрямоугольникБелый"] +position = Vector2(92, 116) +texture = ExtResource("33_5ifkb") + +[node name="СкруглённыйПрямоугольникБелый16" type="Sprite2D" parent="СкруглённыйПрямоугольникБелый"] +position = Vector2(92, 145) +texture = ExtResource("31_b5v2s") + +[node name="СкруглённыйПрямоугольникБелый17" type="Sprite2D" parent="СкруглённыйПрямоугольникБелый"] +position = Vector2(92, 174) +texture = ExtResource("33_5ifkb") + +[node name="СкруглённыйПрямоугольникБелый18" type="Sprite2D" parent="СкруглённыйПрямоугольникБелый"] +position = Vector2(92, 203) +texture = ExtResource("31_b5v2s") + +[node name="СкруглённыйПрямоугольникБелый19" type="Sprite2D" parent="СкруглённыйПрямоугольникБелый"] +position = Vector2(92, 232) +texture = ExtResource("33_5ifkb") + +[node name="СкруглённыйПрямоугольникБелый20" type="Sprite2D" parent="СкруглённыйПрямоугольникБелый"] +position = Vector2(92, 261) +texture = ExtResource("31_b5v2s") + +[node name="СкруглённыйПрямоугольникБелый21" type="Sprite2D" parent="СкруглённыйПрямоугольникБелый"] +position = Vector2(184, 0) +texture = ExtResource("33_5ifkb") + +[node name="СкруглённыйПрямоугольникБелый22" type="Sprite2D" parent="СкруглённыйПрямоугольникБелый"] +position = Vector2(184, 29) +texture = ExtResource("31_b5v2s") + +[node name="СкруглённыйПрямоугольникБелый23" type="Sprite2D" parent="СкруглённыйПрямоугольникБелый"] +position = Vector2(184, 58) +texture = ExtResource("33_5ifkb") + +[node name="СкруглённыйПрямоугольникБелый24" type="Sprite2D" parent="СкруглённыйПрямоугольникБелый"] +position = Vector2(184, 87) +texture = ExtResource("31_b5v2s") + +[node name="СкруглённыйПрямоугольникБелый25" type="Sprite2D" parent="СкруглённыйПрямоугольникБелый"] +position = Vector2(184, 116) +texture = ExtResource("33_5ifkb") + +[node name="СкруглённыйПрямоугольникБелый26" type="Sprite2D" parent="СкруглённыйПрямоугольникБелый"] +position = Vector2(184, 145) +texture = ExtResource("31_b5v2s") + +[node name="СкруглённыйПрямоугольникБелый27" type="Sprite2D" parent="СкруглённыйПрямоугольникБелый"] +position = Vector2(184, 174) +texture = ExtResource("33_5ifkb") + +[node name="СкруглённыйПрямоугольникБелый28" type="Sprite2D" parent="СкруглённыйПрямоугольникБелый"] +position = Vector2(184, 203) +texture = ExtResource("31_b5v2s") + +[node name="СкруглённыйПрямоугольникБелый29" type="Sprite2D" parent="СкруглённыйПрямоугольникБелый"] +position = Vector2(184, 232) +texture = ExtResource("33_5ifkb") + +[node name="СкруглённыйПрямоугольникБелый30" type="Sprite2D" parent="СкруглённыйПрямоугольникБелый"] +position = Vector2(184, 261) +texture = ExtResource("31_b5v2s") + +[node name="СкруглённыйПрямоугольникБелый31" type="Sprite2D" parent="СкруглённыйПрямоугольникБелый"] +position = Vector2(276, 0) +texture = ExtResource("33_5ifkb") + +[node name="СкруглённыйПрямоугольникБелый32" type="Sprite2D" parent="СкруглённыйПрямоугольникБелый"] +position = Vector2(276, 29) +texture = ExtResource("31_b5v2s") + +[node name="СкруглённыйПрямоугольникБелый33" type="Sprite2D" parent="СкруглённыйПрямоугольникБелый"] +position = Vector2(276, 58) +texture = ExtResource("33_5ifkb") + +[node name="СкруглённыйПрямоугольникБелый34" type="Sprite2D" parent="СкруглённыйПрямоугольникБелый"] +position = Vector2(276, 87) +texture = ExtResource("31_b5v2s") + +[node name="СкруглённыйПрямоугольникБелый35" type="Sprite2D" parent="СкруглённыйПрямоугольникБелый"] +position = Vector2(276, 116) +texture = ExtResource("33_5ifkb") + +[node name="СкруглённыйПрямоугольникБелый36" type="Sprite2D" parent="СкруглённыйПрямоугольникБелый"] +position = Vector2(276, 145) +texture = ExtResource("31_b5v2s") + +[node name="СкруглённыйПрямоугольникБелый37" type="Sprite2D" parent="СкруглённыйПрямоугольникБелый"] +position = Vector2(276, 174) +texture = ExtResource("33_5ifkb") + +[node name="СкруглённыйПрямоугольникБелый38" type="Sprite2D" parent="СкруглённыйПрямоугольникБелый"] +position = Vector2(276, 203) +texture = ExtResource("31_b5v2s") + +[node name="СкруглённыйПрямоугольникБелый39" type="Sprite2D" parent="СкруглённыйПрямоугольникБелый"] +position = Vector2(276, 232) +texture = ExtResource("33_5ifkb") + +[node name="СкруглённыйПрямоугольникБелый40" type="Sprite2D" parent="СкруглённыйПрямоугольникБелый"] +position = Vector2(276, 261) +texture = ExtResource("31_b5v2s") + +[node name="СкруглённыйПрямоугольникБелый41" type="Sprite2D" parent="СкруглённыйПрямоугольникБелый"] +position = Vector2(368, 0) +texture = ExtResource("33_5ifkb") + +[node name="СкруглённыйПрямоугольникБелый42" type="Sprite2D" parent="СкруглённыйПрямоугольникБелый"] +position = Vector2(368, 29) +texture = ExtResource("31_b5v2s") + +[node name="СкруглённыйПрямоугольникБелый43" type="Sprite2D" parent="СкруглённыйПрямоугольникБелый"] +position = Vector2(368, 58) +texture = ExtResource("33_5ifkb") + +[node name="СкруглённыйПрямоугольникБелый44" type="Sprite2D" parent="СкруглённыйПрямоугольникБелый"] +position = Vector2(368, 87) +texture = ExtResource("31_b5v2s") + +[node name="СкруглённыйПрямоугольникБелый45" type="Sprite2D" parent="СкруглённыйПрямоугольникБелый"] +position = Vector2(368, 116) +texture = ExtResource("33_5ifkb") + +[node name="СкруглённыйПрямоугольникБелый46" type="Sprite2D" parent="СкруглённыйПрямоугольникБелый"] +position = Vector2(368, 145) +texture = ExtResource("31_b5v2s") + +[node name="СкруглённыйПрямоугольникБелый47" type="Sprite2D" parent="СкруглённыйПрямоугольникБелый"] +position = Vector2(368, 174) +texture = ExtResource("33_5ifkb") + +[node name="СкруглённыйПрямоугольникБелый48" type="Sprite2D" parent="СкруглённыйПрямоугольникБелый"] +position = Vector2(368, 203) +texture = ExtResource("31_b5v2s") + +[node name="СкруглённыйПрямоугольникБелый49" type="Sprite2D" parent="СкруглённыйПрямоугольникБелый"] +position = Vector2(368, 232) +texture = ExtResource("33_5ifkb") + +[node name="СкруглённыйПрямоугольникБелый50" type="Sprite2D" parent="СкруглённыйПрямоугольникБелый"] +position = Vector2(368, 261) +texture = ExtResource("31_b5v2s") + +[node name="СкруглённыйПрямоугольникБелый51" type="Sprite2D" parent="СкруглённыйПрямоугольникБелый"] +position = Vector2(460, 0) +texture = ExtResource("33_5ifkb") + +[node name="СкруглённыйПрямоугольникБелый52" type="Sprite2D" parent="СкруглённыйПрямоугольникБелый"] +position = Vector2(460, 29) +texture = ExtResource("31_b5v2s") + +[node name="СкруглённыйПрямоугольникБелый53" type="Sprite2D" parent="СкруглённыйПрямоугольникБелый"] +position = Vector2(460, 58) +texture = ExtResource("33_5ifkb") + +[node name="СкруглённыйПрямоугольникБелый54" type="Sprite2D" parent="СкруглённыйПрямоугольникБелый"] +position = Vector2(460, 87) +texture = ExtResource("31_b5v2s") + +[node name="СкруглённыйПрямоугольникБелый55" type="Sprite2D" parent="СкруглённыйПрямоугольникБелый"] +position = Vector2(460, 116) +texture = ExtResource("33_5ifkb") + +[node name="СкруглённыйПрямоугольникБелый56" type="Sprite2D" parent="СкруглённыйПрямоугольникБелый"] +position = Vector2(460, 145) +texture = ExtResource("31_b5v2s") + +[node name="СкруглённыйПрямоугольникБелый57" type="Sprite2D" parent="СкруглённыйПрямоугольникБелый"] +position = Vector2(460, 174) +texture = ExtResource("33_5ifkb") + +[node name="СкруглённыйПрямоугольникБелый58" type="Sprite2D" parent="СкруглённыйПрямоугольникБелый"] +position = Vector2(460, 203) +texture = ExtResource("31_b5v2s") + +[node name="СкруглённыйПрямоугольникБелый59" type="Sprite2D" parent="СкруглённыйПрямоугольникБелый"] +position = Vector2(460, 232) +texture = ExtResource("33_5ifkb") + +[node name="СкруглённыйПрямоугольникБелый60" type="Sprite2D" parent="СкруглённыйПрямоугольникБелый"] +position = Vector2(460, 261) +texture = ExtResource("31_b5v2s") + +[node name="СкруглённыйПрямоугольникБелый61" type="Sprite2D" parent="СкруглённыйПрямоугольникБелый"] +position = Vector2(552, 0) +texture = ExtResource("33_5ifkb") + +[node name="СкруглённыйПрямоугольникБелый62" type="Sprite2D" parent="СкруглённыйПрямоугольникБелый"] +position = Vector2(552, 29) +texture = ExtResource("31_b5v2s") + +[node name="СкруглённыйПрямоугольникБелый63" type="Sprite2D" parent="СкруглённыйПрямоугольникБелый"] +position = Vector2(552, 58) +texture = ExtResource("33_5ifkb") + +[node name="СкруглённыйПрямоугольникБелый64" type="Sprite2D" parent="СкруглённыйПрямоугольникБелый"] +position = Vector2(552, 87) +texture = ExtResource("31_b5v2s") + +[node name="СкруглённыйПрямоугольникБелый65" type="Sprite2D" parent="СкруглённыйПрямоугольникБелый"] +position = Vector2(552, 116) +texture = ExtResource("33_5ifkb") + +[node name="СкруглённыйПрямоугольникБелый66" type="Sprite2D" parent="СкруглённыйПрямоугольникБелый"] +position = Vector2(552, 145) +texture = ExtResource("31_b5v2s") + +[node name="СкруглённыйПрямоугольникБелый67" type="Sprite2D" parent="СкруглённыйПрямоугольникБелый"] +position = Vector2(552, 174) +texture = ExtResource("33_5ifkb") + +[node name="СкруглённыйПрямоугольникБелый68" type="Sprite2D" parent="СкруглённыйПрямоугольникБелый"] +position = Vector2(552, 203) +texture = ExtResource("31_b5v2s") + +[node name="СкруглённыйПрямоугольникБелый69" type="Sprite2D" parent="СкруглённыйПрямоугольникБелый"] +position = Vector2(552, 232) +texture = ExtResource("33_5ifkb") + +[node name="СкруглённыйПрямоугольникБелый70" type="Sprite2D" parent="СкруглённыйПрямоугольникБелый"] +position = Vector2(552, 261) +texture = ExtResource("31_b5v2s") + +[node name="СкруглённыйПрямоугольникБелый71" type="Sprite2D" parent="СкруглённыйПрямоугольникБелый"] +position = Vector2(644, 0) +texture = ExtResource("33_5ifkb") + +[node name="СкруглённыйПрямоугольникБелый72" type="Sprite2D" parent="СкруглённыйПрямоугольникБелый"] +position = Vector2(644, 29) +texture = ExtResource("31_b5v2s") + +[node name="СкруглённыйПрямоугольникБелый73" type="Sprite2D" parent="СкруглённыйПрямоугольникБелый"] +position = Vector2(644, 58) +texture = ExtResource("33_5ifkb") + +[node name="СкруглённыйПрямоугольникБелый74" type="Sprite2D" parent="СкруглённыйПрямоугольникБелый"] +position = Vector2(644, 87) +texture = ExtResource("31_b5v2s") + +[node name="СкруглённыйПрямоугольникБелый75" type="Sprite2D" parent="СкруглённыйПрямоугольникБелый"] +position = Vector2(644, 116) +texture = ExtResource("33_5ifkb") + +[node name="СкруглённыйПрямоугольникБелый76" type="Sprite2D" parent="СкруглённыйПрямоугольникБелый"] +position = Vector2(644, 145) +texture = ExtResource("31_b5v2s") + +[node name="СкруглённыйПрямоугольникБелый77" type="Sprite2D" parent="СкруглённыйПрямоугольникБелый"] +position = Vector2(644, 174) +texture = ExtResource("33_5ifkb") + +[node name="СкруглённыйПрямоугольникБелый78" type="Sprite2D" parent="СкруглённыйПрямоугольникБелый"] +position = Vector2(644, 203) +texture = ExtResource("31_b5v2s") + +[node name="СкруглённыйПрямоугольникБелый79" type="Sprite2D" parent="СкруглённыйПрямоугольникБелый"] +position = Vector2(644, 232) +texture = ExtResource("33_5ifkb") + +[node name="СкруглённыйПрямоугольникБелый80" type="Sprite2D" parent="СкруглённыйПрямоугольникБелый"] +position = Vector2(644, 261) +texture = ExtResource("31_b5v2s") + +[node name="СкруглённыйПрямоугольникБелый81" type="Sprite2D" parent="СкруглённыйПрямоугольникБелый"] +position = Vector2(778.461, 29) +texture = ExtResource("31_b5v2s") + +[node name="СкруглённыйПрямоугольникБелый82" type="Sprite2D" parent="СкруглённыйПрямоугольникБелый"] +position = Vector2(778.461, 58) +texture = ExtResource("33_5ifkb") + +[node name="СкруглённыйПрямоугольникБелый83" type="Sprite2D" parent="СкруглённыйПрямоугольникБелый"] +position = Vector2(778.461, 87) +texture = ExtResource("31_b5v2s") + +[node name="СкруглённыйПрямоугольникБелый84" type="Sprite2D" parent="СкруглённыйПрямоугольникБелый"] +position = Vector2(778.461, 116) +texture = ExtResource("33_5ifkb") + +[node name="СкруглённыйПрямоугольникБелый85" type="Sprite2D" parent="СкруглённыйПрямоугольникБелый"] +position = Vector2(778.461, 145) +texture = ExtResource("31_b5v2s") + +[node name="СкруглённыйПрямоугольникБелый86" type="Sprite2D" parent="СкруглённыйПрямоугольникБелый"] +position = Vector2(778.461, 174) +texture = ExtResource("33_5ifkb") + +[node name="СкруглённыйПрямоугольникБелый87" type="Sprite2D" parent="СкруглённыйПрямоугольникБелый"] +position = Vector2(778.461, 203) +texture = ExtResource("31_b5v2s") + +[node name="СкруглённыйПрямоугольникБелый88" type="Sprite2D" parent="СкруглённыйПрямоугольникБелый"] +position = Vector2(778.461, 232) +texture = ExtResource("33_5ifkb") + +[node name="СкруглённыйПрямоугольникБелый89" type="Sprite2D" parent="СкруглённыйПрямоугольникБелый"] +position = Vector2(778.461, 261) +texture = ExtResource("31_b5v2s") + +[node name="КнопкаПодтверждения02" type="Sprite2D" parent="СкруглённыйПрямоугольникБелый"] +position = Vector2(778.683, 0.25) +scale = Vector2(1.22077, 1.28261) +texture = ExtResource("32_p41nv") + +[node name="СкруглённыйПрямоугольникБелый90" type="Sprite2D" parent="СкруглённыйПрямоугольникБелый"] +position = Vector2(778.461, 29) +texture = ExtResource("31_b5v2s") + +[node name="СкруглённыйПрямоугольникБелый91" type="Sprite2D" parent="СкруглённыйПрямоугольникБелый"] +position = Vector2(778.461, 58) +texture = ExtResource("33_5ifkb") + +[node name="СкруглённыйПрямоугольникБелый92" type="Sprite2D" parent="СкруглённыйПрямоугольникБелый"] +position = Vector2(778.461, 87) +texture = ExtResource("31_b5v2s") + +[node name="СкруглённыйПрямоугольникБелый93" type="Sprite2D" parent="СкруглённыйПрямоугольникБелый"] +position = Vector2(778.461, 116) +texture = ExtResource("33_5ifkb") + +[node name="СкруглённыйПрямоугольникБелый94" type="Sprite2D" parent="СкруглённыйПрямоугольникБелый"] +position = Vector2(778.461, 145) +texture = ExtResource("31_b5v2s") + +[node name="СкруглённыйПрямоугольникБелый95" type="Sprite2D" parent="СкруглённыйПрямоугольникБелый"] +position = Vector2(778.461, 174) +texture = ExtResource("33_5ifkb") + +[node name="СкруглённыйПрямоугольникБелый96" type="Sprite2D" parent="СкруглённыйПрямоугольникБелый"] +position = Vector2(778.461, 203) +texture = ExtResource("31_b5v2s") + +[node name="СкруглённыйПрямоугольникБелый97" type="Sprite2D" parent="СкруглённыйПрямоугольникБелый"] +position = Vector2(778.461, 232) +texture = ExtResource("33_5ifkb") + +[node name="СкруглённыйПрямоугольникБелый98" type="Sprite2D" parent="СкруглённыйПрямоугольникБелый"] +position = Vector2(778.461, 261) +texture = ExtResource("31_b5v2s") + +[node name="КнопкаПодтверждения03" type="Sprite2D" parent="СкруглённыйПрямоугольникБелый"] +position = Vector2(913.144, 0.25) +scale = Vector2(1.22077, 1.28261) +texture = ExtResource("32_p41nv") + +[node name="СкруглённыйПрямоугольникБелый99" type="Sprite2D" parent="СкруглённыйПрямоугольникБелый"] +position = Vector2(912.923, 29) +texture = ExtResource("31_b5v2s") + +[node name="СкруглённыйПрямоугольникБелый100" type="Sprite2D" parent="СкруглённыйПрямоугольникБелый"] +position = Vector2(912.923, 58) +texture = ExtResource("33_5ifkb") + +[node name="СкруглённыйПрямоугольникБелый101" type="Sprite2D" parent="СкруглённыйПрямоугольникБелый"] +position = Vector2(912.923, 87) +texture = ExtResource("31_b5v2s") + +[node name="СкруглённыйПрямоугольникБелый102" type="Sprite2D" parent="СкруглённыйПрямоугольникБелый"] +position = Vector2(912.923, 116) +texture = ExtResource("33_5ifkb") + +[node name="СкруглённыйПрямоугольникБелый103" type="Sprite2D" parent="СкруглённыйПрямоугольникБелый"] +position = Vector2(912.923, 145) +texture = ExtResource("31_b5v2s") + +[node name="СкруглённыйПрямоугольникБелый104" type="Sprite2D" parent="СкруглённыйПрямоугольникБелый"] +position = Vector2(912.923, 174) +texture = ExtResource("33_5ifkb") + +[node name="СкруглённыйПрямоугольникБелый105" type="Sprite2D" parent="СкруглённыйПрямоугольникБелый"] +position = Vector2(912.923, 203) +texture = ExtResource("31_b5v2s") + +[node name="СкруглённыйПрямоугольникБелый106" type="Sprite2D" parent="СкруглённыйПрямоугольникБелый"] +position = Vector2(912.923, 232) +texture = ExtResource("33_5ifkb") + +[node name="СкруглённыйПрямоугольникБелый107" type="Sprite2D" parent="СкруглённыйПрямоугольникБелый"] +position = Vector2(912.923, 261) +texture = ExtResource("31_b5v2s") + +[node name="СкруглённыйПрямоугольникБелый108" type="Sprite2D" parent="СкруглённыйПрямоугольникБелый"] +position = Vector2(711.231, 0) +scale = Vector2(0.461539, 1) +texture = ExtResource("33_5ifkb") + +[node name="СкруглённыйПрямоугольникБелый109" type="Sprite2D" parent="СкруглённыйПрямоугольникБелый"] +position = Vector2(711.231, 29) +scale = Vector2(0.461539, 1) +texture = ExtResource("31_b5v2s") + +[node name="СкруглённыйПрямоугольникБелый110" type="Sprite2D" parent="СкруглённыйПрямоугольникБелый"] +position = Vector2(711.231, 58) +scale = Vector2(0.461539, 1) +texture = ExtResource("33_5ifkb") + +[node name="СкруглённыйПрямоугольникБелый111" type="Sprite2D" parent="СкруглённыйПрямоугольникБелый"] +position = Vector2(711.231, 87) +scale = Vector2(0.461539, 1) +texture = ExtResource("31_b5v2s") + +[node name="СкруглённыйПрямоугольникБелый112" type="Sprite2D" parent="СкруглённыйПрямоугольникБелый"] +position = Vector2(711.231, 116) +scale = Vector2(0.461539, 1) +texture = ExtResource("33_5ifkb") + +[node name="СкруглённыйПрямоугольникБелый113" type="Sprite2D" parent="СкруглённыйПрямоугольникБелый"] +position = Vector2(711.231, 145) +scale = Vector2(0.461539, 1) +texture = ExtResource("31_b5v2s") + +[node name="СкруглённыйПрямоугольникБелый114" type="Sprite2D" parent="СкруглённыйПрямоугольникБелый"] +position = Vector2(711.231, 174) +scale = Vector2(0.461539, 1) +texture = ExtResource("33_5ifkb") + +[node name="СкруглённыйПрямоугольникБелый115" type="Sprite2D" parent="СкруглённыйПрямоугольникБелый"] +position = Vector2(711.231, 203) +scale = Vector2(0.461539, 1) +texture = ExtResource("31_b5v2s") + +[node name="СкруглённыйПрямоугольникБелый116" type="Sprite2D" parent="СкруглённыйПрямоугольникБелый"] +position = Vector2(711.231, 232) +scale = Vector2(0.461539, 1) +texture = ExtResource("33_5ifkb") + +[node name="СкруглённыйПрямоугольникБелый117" type="Sprite2D" parent="СкруглённыйПрямоугольникБелый"] +position = Vector2(711.231, 261) +scale = Vector2(0.461539, 1) +texture = ExtResource("31_b5v2s") + +[node name="СкруглённыйПрямоугольникБелый118" type="Sprite2D" parent="СкруглённыйПрямоугольникБелый"] +position = Vector2(845.692, 0) +scale = Vector2(0.461539, 1) +texture = ExtResource("33_5ifkb") + +[node name="СкруглённыйПрямоугольникБелый119" type="Sprite2D" parent="СкруглённыйПрямоугольникБелый"] +position = Vector2(845.692, 29) +scale = Vector2(0.461539, 1) +texture = ExtResource("31_b5v2s") + +[node name="СкруглённыйПрямоугольникБелый120" type="Sprite2D" parent="СкруглённыйПрямоугольникБелый"] +position = Vector2(845.692, 58) +scale = Vector2(0.461539, 1) +texture = ExtResource("33_5ifkb") + +[node name="СкруглённыйПрямоугольникБелый121" type="Sprite2D" parent="СкруглённыйПрямоугольникБелый"] +position = Vector2(845.692, 87) +scale = Vector2(0.461539, 1) +texture = ExtResource("31_b5v2s") + +[node name="СкруглённыйПрямоугольникБелый122" type="Sprite2D" parent="СкруглённыйПрямоугольникБелый"] +position = Vector2(845.692, 116) +scale = Vector2(0.461539, 1) +texture = ExtResource("33_5ifkb") + +[node name="СкруглённыйПрямоугольникБелый123" type="Sprite2D" parent="СкруглённыйПрямоугольникБелый"] +position = Vector2(845.692, 145) +scale = Vector2(0.461539, 1) +texture = ExtResource("31_b5v2s") + +[node name="СкруглённыйПрямоугольникБелый124" type="Sprite2D" parent="СкруглённыйПрямоугольникБелый"] +position = Vector2(845.692, 174) +scale = Vector2(0.461539, 1) +texture = ExtResource("33_5ifkb") + +[node name="СкруглённыйПрямоугольникБелый125" type="Sprite2D" parent="СкруглённыйПрямоугольникБелый"] +position = Vector2(845.692, 203) +scale = Vector2(0.461539, 1) +texture = ExtResource("31_b5v2s") + +[node name="СкруглённыйПрямоугольникБелый126" type="Sprite2D" parent="СкруглённыйПрямоугольникБелый"] +position = Vector2(845.692, 232) +scale = Vector2(0.461539, 1) +texture = ExtResource("33_5ifkb") + +[node name="СкруглённыйПрямоугольникБелый127" type="Sprite2D" parent="СкруглённыйПрямоугольникБелый"] +position = Vector2(845.692, 261) +scale = Vector2(0.461539, 1) +texture = ExtResource("31_b5v2s") + +[node name="Label4" type="Label" parent="СкруглённыйПрямоугольникБелый"] +offset_left = 61.9231 +offset_top = -10.0 +offset_right = 129.923 +offset_bottom = 9.0 +theme_override_colors/font_color = Color(0, 0, 0, 1) +text = "--" +horizontal_alignment = 1 + +[node name="Label5" type="Label" parent="СкруглённыйПрямоугольникБелый"] +offset_left = 154.808 +offset_top = -10.0 +offset_right = 222.808 +offset_bottom = 9.0 +theme_override_colors/font_color = Color(0, 0, 0, 1) +text = "--" +horizontal_alignment = 1 + +[node name="Label6" type="Label" parent="СкруглённыйПрямоугольникБелый"] +offset_left = 245.923 +offset_top = -10.0 +offset_right = 313.923 +offset_bottom = 9.0 +theme_override_colors/font_color = Color(0, 0, 0, 1) +text = "--" +horizontal_alignment = 1 + +[node name="Label7" type="Label" parent="СкруглённыйПрямоугольникБелый"] +offset_left = 337.923 +offset_top = -10.0 +offset_right = 405.923 +offset_bottom = 9.0 +theme_override_colors/font_color = Color(0, 0, 0, 1) +text = "--" +horizontal_alignment = 1 + +[node name="Label8" type="Label" parent="СкруглённыйПрямоугольникБелый"] +offset_left = 429.923 +offset_top = -10.0 +offset_right = 497.923 +offset_bottom = 9.0 +theme_override_colors/font_color = Color(0, 0, 0, 1) +text = "--" +horizontal_alignment = 1 + +[node name="Label9" type="Label" parent="СкруглённыйПрямоугольникБелый"] +offset_left = 522.808 +offset_top = -10.0 +offset_right = 590.808 +offset_bottom = 9.0 +theme_override_colors/font_color = Color(0, 0, 0, 1) +text = "--" +horizontal_alignment = 1 + +[node name="Label10" type="Label" parent="СкруглённыйПрямоугольникБелый"] +offset_left = 614.808 +offset_top = -10.0 +offset_right = 682.808 +offset_bottom = 9.0 +theme_override_colors/font_color = Color(0, 0, 0, 1) +text = "--" +horizontal_alignment = 1 + +[node name="Label11" type="Label" parent="СкруглённыйПрямоугольникБелый"] +offset_left = 706.808 +offset_top = -10.0 +offset_right = 718.808 +offset_bottom = 9.0 +theme_override_colors/font_color = Color(0, 0, 0, 1) +text = "--" +horizontal_alignment = 1 + +[node name="Label12" type="Label" parent="СкруглённыйПрямоугольникБелый"] +offset_left = 841.269 +offset_top = -10.0 +offset_right = 853.269 +offset_bottom = 9.0 +theme_override_colors/font_color = Color(0, 0, 0, 1) +text = "--" +horizontal_alignment = 1 From 510967bcd8ec9d09e34ebaa63195447dec6efb0f Mon Sep 17 00:00:00 2001 From: lepshiy Date: Fri, 24 Oct 2025 12:29:02 +0300 Subject: [PATCH 12/12] =?UTF-8?q?=D0=94=D0=B2=D0=B8=D0=B6=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5=20=D0=BA=D0=BE=D1=80=D0=B0=D0=B1=D0=BB=D0=B8=D0=BA?= =?UTF-8?q?=D0=B0=20=D0=BF=D0=BE=20=D0=BA=D0=BE=D0=BE=D1=80=D0=B4=D0=B8?= =?UTF-8?q?=D0=BD=D0=B0=D1=82=D0=B0=D0=BC.=20=D0=AD=D0=BA=D1=80=D0=B0?= =?UTF-8?q?=D0=BD=20=D0=AD=D0=9C=D0=A1=20=D0=A2=D0=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scenes/tilemap/tilemap.gd | 1 + scenes/работа/работа.tscn | 2 +- scenes/эмс2/эмс2.tscn | 10 +--------- 3 files changed, 3 insertions(+), 10 deletions(-) diff --git a/scenes/tilemap/tilemap.gd b/scenes/tilemap/tilemap.gd index 383be97f..e363d95b 100644 --- a/scenes/tilemap/tilemap.gd +++ b/scenes/tilemap/tilemap.gd @@ -707,6 +707,7 @@ func set_coordinates(lon: float, lat: float, course: float) -> void: add_mark_from_lon_lat(ship_id, lon, lat, ship_instance, 0.0) else: _marks[ship_id].position = lonlat_to_world(lon, lat) + ship_instance.rotation_degrees = course queue_redraw() diff --git a/scenes/работа/работа.tscn b/scenes/работа/работа.tscn index 4d4e5faf..498e6a92 100644 --- a/scenes/работа/работа.tscn +++ b/scenes/работа/работа.tscn @@ -349,7 +349,7 @@ text = "−" [connection signal="toggled" from="btn_activate" to="." method="on_btn_activate_toggled"] [connection signal="toggled" from="btn_center" to="." method="on_btn_center_toggled"] [connection signal="button_down" from="zoom_plus" to="tilemap" method="_on_zoom_plus_button_down"] -[connection signal="button_up" from="zoom_plus" to="tilemap" method="_on_zoom_button_up"] [connection signal="button_up" from="zoom_plus" to="tilemap" method="_on_zoom_plus_button_up"] +[connection signal="button_up" from="zoom_plus" to="tilemap" method="_on_zoom_button_up"] [connection signal="button_down" from="zoom_minus" to="tilemap" method="_on_zoom_minus_button_down"] [connection signal="button_up" from="zoom_minus" to="tilemap" method="_on_zoom_button_up"] diff --git a/scenes/эмс2/эмс2.tscn b/scenes/эмс2/эмс2.tscn index ae3232bd..55ccd986 100644 --- a/scenes/эмс2/эмс2.tscn +++ b/scenes/эмс2/эмс2.tscn @@ -403,6 +403,7 @@ theme_override_font_sizes/font_size = 16 text = "Излучение" [node name="Label2" type="Label" parent="."] +layout_mode = 0 offset_left = 813.0 offset_top = 503.0 offset_right = 861.0 @@ -418,47 +419,38 @@ texture = ExtResource("29_5u4bk") [node name="СкруглённыйПрямоугСалатный4" type="Sprite2D" parent="СкруглённыйПрямоугСалатный"] position = Vector2(660, 0) -scale = Vector2(1, 1) texture = ExtResource("29_5u4bk") [node name="СкруглённыйПрямоугСалатный5" type="Sprite2D" parent="СкруглённыйПрямоугСалатный"] position = Vector2(774, 0) -scale = Vector2(1, 1) texture = ExtResource("29_5u4bk") [node name="СкруглённыйПрямоугСалатный6" type="Sprite2D" parent="СкруглённыйПрямоугСалатный"] position = Vector2(546, 0) -scale = Vector2(1, 1) texture = ExtResource("29_5u4bk") [node name="СкруглённыйПрямоугСалатный7" type="Sprite2D" parent="СкруглённыйПрямоугСалатный"] position = Vector2(468, 0) -scale = Vector2(1, 1) texture = ExtResource("29_5u4bk") [node name="СкруглённыйПрямоугСалатный8" type="Sprite2D" parent="СкруглённыйПрямоугСалатный"] position = Vector2(390, 0) -scale = Vector2(1, 1) texture = ExtResource("29_5u4bk") [node name="СкруглённыйПрямоугСалатный9" type="Sprite2D" parent="СкруглённыйПрямоугСалатный"] position = Vector2(312, 0) -scale = Vector2(1, 1) texture = ExtResource("29_5u4bk") [node name="СкруглённыйПрямоугСалатный10" type="Sprite2D" parent="СкруглённыйПрямоугСалатный"] position = Vector2(234, 0) -scale = Vector2(1, 1) texture = ExtResource("29_5u4bk") [node name="СкруглённыйПрямоугСалатный11" type="Sprite2D" parent="СкруглённыйПрямоугСалатный"] position = Vector2(156, 0) -scale = Vector2(1, 1) texture = ExtResource("29_5u4bk") [node name="СкруглённыйПрямоугСалатный12" type="Sprite2D" parent="СкруглённыйПрямоугСалатный"] position = Vector2(78, 0) -scale = Vector2(1, 1) texture = ExtResource("29_5u4bk") [node name="Приём" type="Sprite2D" parent="СкруглённыйПрямоугСалатный"]