From 5d4396e7656683ff036ae820fa33fac1539b8411 Mon Sep 17 00:00:00 2001 From: MaD_CaT Date: Wed, 24 Jan 2024 14:07:20 +0300 Subject: [PATCH 1/4] Godot4 --- scenes/pribor-afsp-l/pribor-afsp-l.tscn | 46 +++++++++++++++++++++++++ scenes/pribor-rtr/pribor-rtr.tscn | 5 +++ scenes/pribor-sch3/pribor-sch3.tscn | 6 ++++ scenes/pribor-uf/pribor-uf.tscn | 6 ++++ scenes/работа/работа.gd | 8 +++++ 5 files changed, 71 insertions(+) diff --git a/scenes/pribor-afsp-l/pribor-afsp-l.tscn b/scenes/pribor-afsp-l/pribor-afsp-l.tscn index 6f23471..c2a3b9d 100644 --- a/scenes/pribor-afsp-l/pribor-afsp-l.tscn +++ b/scenes/pribor-afsp-l/pribor-afsp-l.tscn @@ -17,6 +17,7 @@ patch_margin_right = 16 patch_margin_bottom = 16 [node name="ref_block_la1" type="NinePatchRect" parent="ref_A1_lpa"] +layout_mode = 0 offset_left = 32.0 offset_top = 70.0 offset_right = 332.0 @@ -28,6 +29,7 @@ patch_margin_right = 16 patch_margin_bottom = 16 [node name="ref_mshu1" parent="ref_A1_lpa/ref_block_la1" instance=ExtResource("2_wgsuv")] +layout_mode = 0 offset_left = 20.0 offset_top = 211.0 offset_right = 280.0 @@ -36,6 +38,7 @@ fname = "МШУ" rname = "А5" [node name="ref_mshu2" parent="ref_A1_lpa/ref_block_la1" instance=ExtResource("2_wgsuv")] +layout_mode = 0 offset_left = 20.0 offset_top = 89.0 offset_right = 280.0 @@ -44,6 +47,7 @@ fname = "МШУ" rname = "А2" [node name="ref_mshu3" parent="ref_A1_lpa/ref_block_la1" instance=ExtResource("2_wgsuv")] +layout_mode = 0 offset_left = 20.0 offset_top = 130.0 offset_right = 280.0 @@ -52,6 +56,7 @@ fname = "МШУ" rname = "А3" [node name="ref_mshu4" parent="ref_A1_lpa/ref_block_la1" instance=ExtResource("2_wgsuv")] +layout_mode = 0 offset_left = 20.0 offset_top = 171.0 offset_right = 280.0 @@ -60,6 +65,7 @@ fname = "МШУ" rname = "А4" [node name="ref_mshu5" parent="ref_A1_lpa/ref_block_la1" instance=ExtResource("2_wgsuv")] +layout_mode = 0 offset_left = 20.0 offset_top = 252.0 offset_right = 280.0 @@ -68,6 +74,7 @@ fname = "МШУ" rname = "А6" [node name="ref_mshu6" parent="ref_A1_lpa/ref_block_la1" instance=ExtResource("2_wgsuv")] +layout_mode = 0 offset_left = 20.0 offset_top = 48.0 offset_right = 280.0 @@ -76,6 +83,7 @@ fname = "МШУ" rname = "А1" [node name="ref_mshu7" parent="ref_A1_lpa/ref_block_la1" instance=ExtResource("2_wgsuv")] +layout_mode = 0 offset_left = 20.0 offset_top = 291.0 offset_right = 280.0 @@ -84,6 +92,7 @@ fname = "МШУ" rname = "А7" [node name="ref_mshu8" parent="ref_A1_lpa/ref_block_la1" instance=ExtResource("2_wgsuv")] +layout_mode = 0 offset_left = 20.0 offset_top = 334.0 offset_right = 280.0 @@ -100,6 +109,7 @@ offset_bottom = 41.0 text = "Модули ЛА6А45" [node name="ref_bpch" type="NinePatchRect" parent="ref_A1_lpa"] +layout_mode = 0 offset_left = 32.0 offset_top = 458.0 offset_right = 332.0 @@ -111,6 +121,7 @@ patch_margin_right = 16 patch_margin_bottom = 16 [node name="lbl_bpch" type="Label" parent="ref_A1_lpa/ref_bpch"] +layout_mode = 0 offset_left = 135.0 offset_top = 16.0 offset_right = 167.0 @@ -127,6 +138,7 @@ fname = "Модуль ОГ" rname = "А23" [node name="ref_geterodin" parent="ref_A1_lpa/ref_bpch" instance=ExtResource("2_wgsuv")] +layout_mode = 0 offset_left = 20.0 offset_top = 85.0 offset_right = 280.0 @@ -135,6 +147,7 @@ fname = "Гетеродин" rname = "А10" [node name="ref_block_la2" type="NinePatchRect" parent="ref_A1_lpa"] +layout_mode = 0 offset_left = 33.0 offset_top = 605.0 offset_right = 333.0 @@ -146,6 +159,7 @@ patch_margin_right = 16 patch_margin_bottom = 16 [node name="ref_mshu9" parent="ref_A1_lpa/ref_block_la2" instance=ExtResource("2_wgsuv")] +layout_mode = 0 offset_left = 20.0 offset_top = 48.0 offset_right = 280.0 @@ -154,6 +168,7 @@ fname = "МШУ" rname = "А9" [node name="ref_mshu10" parent="ref_A1_lpa/ref_block_la2" instance=ExtResource("2_wgsuv")] +layout_mode = 0 offset_left = 20.0 offset_top = 89.0 offset_right = 280.0 @@ -162,6 +177,7 @@ fname = "МШУ" rname = "А10" [node name="ref_mshu11" parent="ref_A1_lpa/ref_block_la2" instance=ExtResource("2_wgsuv")] +layout_mode = 0 offset_left = 20.0 offset_top = 130.0 offset_right = 280.0 @@ -170,6 +186,7 @@ fname = "МШУ" rname = "А11" [node name="ref_mshu12" parent="ref_A1_lpa/ref_block_la2" instance=ExtResource("2_wgsuv")] +layout_mode = 0 offset_left = 20.0 offset_top = 171.0 offset_right = 280.0 @@ -178,6 +195,7 @@ fname = "МШУ" rname = "А12" [node name="ref_mshu13" parent="ref_A1_lpa/ref_block_la2" instance=ExtResource("2_wgsuv")] +layout_mode = 0 offset_left = 20.0 offset_top = 211.0 offset_right = 280.0 @@ -186,6 +204,7 @@ fname = "МШУ" rname = "А13" [node name="ref_mshu14" parent="ref_A1_lpa/ref_block_la2" instance=ExtResource("2_wgsuv")] +layout_mode = 0 offset_left = 20.0 offset_top = 252.0 offset_right = 280.0 @@ -194,6 +213,7 @@ fname = "МШУ" rname = "А14" [node name="ref_mshu15" parent="ref_A1_lpa/ref_block_la2" instance=ExtResource("2_wgsuv")] +layout_mode = 0 offset_left = 20.0 offset_top = 291.0 offset_right = 280.0 @@ -202,6 +222,7 @@ fname = "МШУ" rname = "А15" [node name="ref_mshu16" parent="ref_A1_lpa/ref_block_la2" instance=ExtResource("2_wgsuv")] +layout_mode = 0 offset_left = 20.0 offset_top = 334.0 offset_right = 280.0 @@ -218,6 +239,7 @@ offset_bottom = 41.0 text = "Модули ЛА6А45" [node name="lbl_lpa" type="Label" parent="ref_A1_lpa"] +layout_mode = 0 offset_left = 169.0 offset_top = 28.0 offset_right = 197.0 @@ -225,6 +247,7 @@ offset_bottom = 52.0 text = "ЛПА" [node name="lbl_A" type="Label" parent="ref_A1_lpa"] +layout_mode = 0 offset_left = 302.0 offset_top = 16.0 offset_right = 330.0 @@ -243,6 +266,7 @@ patch_margin_right = 16 patch_margin_bottom = 16 [node name="ref_block_la1" type="NinePatchRect" parent="ref_A2_lpa"] +layout_mode = 0 offset_left = 32.0 offset_top = 70.0 offset_right = 332.0 @@ -254,6 +278,7 @@ patch_margin_right = 16 patch_margin_bottom = 16 [node name="ref_mshu1" parent="ref_A2_lpa/ref_block_la1" instance=ExtResource("2_wgsuv")] +layout_mode = 0 offset_left = 20.0 offset_top = 211.0 offset_right = 280.0 @@ -262,6 +287,7 @@ fname = "МШУ" rname = "А5" [node name="ref_mshu2" parent="ref_A2_lpa/ref_block_la1" instance=ExtResource("2_wgsuv")] +layout_mode = 0 offset_left = 20.0 offset_top = 89.0 offset_right = 280.0 @@ -270,6 +296,7 @@ fname = "МШУ" rname = "А2" [node name="ref_mshu3" parent="ref_A2_lpa/ref_block_la1" instance=ExtResource("2_wgsuv")] +layout_mode = 0 offset_left = 20.0 offset_top = 130.0 offset_right = 280.0 @@ -278,6 +305,7 @@ fname = "МШУ" rname = "А3" [node name="ref_mshu4" parent="ref_A2_lpa/ref_block_la1" instance=ExtResource("2_wgsuv")] +layout_mode = 0 offset_left = 20.0 offset_top = 171.0 offset_right = 280.0 @@ -286,6 +314,7 @@ fname = "МШУ" rname = "А4" [node name="ref_mshu5" parent="ref_A2_lpa/ref_block_la1" instance=ExtResource("2_wgsuv")] +layout_mode = 0 offset_left = 20.0 offset_top = 252.0 offset_right = 280.0 @@ -294,6 +323,7 @@ fname = "МШУ" rname = "А6" [node name="ref_mshu6" parent="ref_A2_lpa/ref_block_la1" instance=ExtResource("2_wgsuv")] +layout_mode = 0 offset_left = 20.0 offset_top = 48.0 offset_right = 280.0 @@ -302,6 +332,7 @@ fname = "МШУ" rname = "А1" [node name="ref_mshu7" parent="ref_A2_lpa/ref_block_la1" instance=ExtResource("2_wgsuv")] +layout_mode = 0 offset_left = 20.0 offset_top = 291.0 offset_right = 280.0 @@ -310,6 +341,7 @@ fname = "МШУ" rname = "А7" [node name="ref_mshu8" parent="ref_A2_lpa/ref_block_la1" instance=ExtResource("2_wgsuv")] +layout_mode = 0 offset_left = 20.0 offset_top = 334.0 offset_right = 280.0 @@ -326,6 +358,7 @@ offset_bottom = 41.0 text = "Модули ЛА6А45" [node name="ref_bpch" type="NinePatchRect" parent="ref_A2_lpa"] +layout_mode = 0 offset_left = 32.0 offset_top = 458.0 offset_right = 332.0 @@ -337,6 +370,7 @@ patch_margin_right = 16 patch_margin_bottom = 16 [node name="lbl_bpch" type="Label" parent="ref_A2_lpa/ref_bpch"] +layout_mode = 0 offset_left = 135.0 offset_top = 16.0 offset_right = 167.0 @@ -353,6 +387,7 @@ fname = "Модуль ОГ" rname = "А23" [node name="ref_geterodin" parent="ref_A2_lpa/ref_bpch" instance=ExtResource("2_wgsuv")] +layout_mode = 0 offset_left = 20.0 offset_top = 85.0 offset_right = 280.0 @@ -361,6 +396,7 @@ fname = "Гетеродин" rname = "А10" [node name="ref_block_la2" type="NinePatchRect" parent="ref_A2_lpa"] +layout_mode = 0 offset_left = 33.0 offset_top = 605.0 offset_right = 333.0 @@ -372,6 +408,7 @@ patch_margin_right = 16 patch_margin_bottom = 16 [node name="ref_mshu9" parent="ref_A2_lpa/ref_block_la2" instance=ExtResource("2_wgsuv")] +layout_mode = 0 offset_left = 20.0 offset_top = 48.0 offset_right = 280.0 @@ -380,6 +417,7 @@ fname = "МШУ" rname = "А9" [node name="ref_mshu10" parent="ref_A2_lpa/ref_block_la2" instance=ExtResource("2_wgsuv")] +layout_mode = 0 offset_left = 20.0 offset_top = 89.0 offset_right = 280.0 @@ -388,6 +426,7 @@ fname = "МШУ" rname = "А10" [node name="ref_mshu11" parent="ref_A2_lpa/ref_block_la2" instance=ExtResource("2_wgsuv")] +layout_mode = 0 offset_left = 20.0 offset_top = 130.0 offset_right = 280.0 @@ -396,6 +435,7 @@ fname = "МШУ" rname = "А11" [node name="ref_mshu12" parent="ref_A2_lpa/ref_block_la2" instance=ExtResource("2_wgsuv")] +layout_mode = 0 offset_left = 20.0 offset_top = 171.0 offset_right = 280.0 @@ -404,6 +444,7 @@ fname = "МШУ" rname = "А12" [node name="ref_mshu13" parent="ref_A2_lpa/ref_block_la2" instance=ExtResource("2_wgsuv")] +layout_mode = 0 offset_left = 20.0 offset_top = 211.0 offset_right = 280.0 @@ -412,6 +453,7 @@ fname = "МШУ" rname = "А13" [node name="ref_mshu14" parent="ref_A2_lpa/ref_block_la2" instance=ExtResource("2_wgsuv")] +layout_mode = 0 offset_left = 20.0 offset_top = 252.0 offset_right = 280.0 @@ -420,6 +462,7 @@ fname = "МШУ" rname = "А14" [node name="ref_mshu15" parent="ref_A2_lpa/ref_block_la2" instance=ExtResource("2_wgsuv")] +layout_mode = 0 offset_left = 20.0 offset_top = 291.0 offset_right = 280.0 @@ -428,6 +471,7 @@ fname = "МШУ" rname = "А15" [node name="ref_mshu16" parent="ref_A2_lpa/ref_block_la2" instance=ExtResource("2_wgsuv")] +layout_mode = 0 offset_left = 20.0 offset_top = 334.0 offset_right = 280.0 @@ -444,6 +488,7 @@ offset_bottom = 41.0 text = "Модули ЛА6А45" [node name="lbl_lpa" type="Label" parent="ref_A2_lpa"] +layout_mode = 0 offset_left = 169.0 offset_top = 28.0 offset_right = 197.0 @@ -451,6 +496,7 @@ offset_bottom = 52.0 text = "ЛПА" [node name="lbl_A" type="Label" parent="ref_A2_lpa"] +layout_mode = 0 offset_left = 302.0 offset_top = 16.0 offset_right = 330.0 diff --git a/scenes/pribor-rtr/pribor-rtr.tscn b/scenes/pribor-rtr/pribor-rtr.tscn index ebf0fe6..a58f09f 100644 --- a/scenes/pribor-rtr/pribor-rtr.tscn +++ b/scenes/pribor-rtr/pribor-rtr.tscn @@ -17,6 +17,7 @@ patch_margin_right = 16 patch_margin_bottom = 16 [node name="ref_A23" parent="ref_G1" instance=ExtResource("2_e75yj")] +layout_mode = 0 offset_left = 105.0 offset_top = 28.0 offset_right = 265.0 @@ -37,6 +38,7 @@ patch_margin_right = 16 patch_margin_bottom = 16 [node name="ref_A24" parent="ref_A1" instance=ExtResource("2_e75yj")] +layout_mode = 0 offset_left = 334.0 offset_top = 74.0 offset_right = 644.0 @@ -46,6 +48,7 @@ rname = "A24" state = 1 [node name="ref_A25" parent="ref_A1" instance=ExtResource("2_e75yj")] +layout_mode = 0 offset_left = 70.0 offset_top = 115.0 offset_right = 275.0 @@ -66,6 +69,7 @@ patch_margin_right = 16 patch_margin_bottom = 16 [node name="ref_A26" parent="ref_A2" instance=ExtResource("2_e75yj")] +layout_mode = 0 offset_left = 336.0 offset_top = 68.0 offset_right = 646.0 @@ -75,6 +79,7 @@ rname = "A27" state = 1 [node name="ref_A27" parent="ref_A2" instance=ExtResource("2_e75yj")] +layout_mode = 0 offset_left = 68.0 offset_top = 112.0 offset_right = 273.0 diff --git a/scenes/pribor-sch3/pribor-sch3.tscn b/scenes/pribor-sch3/pribor-sch3.tscn index 67dc6f7..6b0138e 100644 --- a/scenes/pribor-sch3/pribor-sch3.tscn +++ b/scenes/pribor-sch3/pribor-sch3.tscn @@ -50,6 +50,7 @@ state = 1 [node name="lbl_legend1" type="Label" parent="ref_G1"] self_modulate = Color(1, 1, 1, 0.627451) +layout_mode = 0 offset_left = 32.0 offset_top = 880.0 offset_right = 105.0 @@ -58,6 +59,7 @@ theme_override_font_sizes/font_size = 17 text = "Исправно" [node name="txr_legend0" type="TextureRect" parent="ref_G1"] +layout_mode = 0 offset_left = 204.0 offset_top = 880.0 offset_right = 428.0 @@ -67,6 +69,7 @@ texture = ExtResource("3_vvbft") [node name="lbl_legend0" type="Label" parent="ref_G1"] self_modulate = Color(1, 1, 1, 0.627451) +layout_mode = 0 offset_left = 232.0 offset_top = 880.0 offset_right = 388.0 @@ -75,6 +78,7 @@ theme_override_font_sizes/font_size = 17 text = "Ожидание результата" [node name="txr_legend2" type="TextureRect" parent="ref_G1"] +layout_mode = 0 offset_left = 461.0 offset_top = 880.0 offset_right = 685.0 @@ -84,6 +88,7 @@ texture = ExtResource("4_ly6ja") [node name="lbl_legend2" type="Label" parent="ref_G1"] self_modulate = Color(1, 1, 1, 0.627451) +layout_mode = 0 offset_left = 489.0 offset_top = 880.0 offset_right = 645.0 @@ -93,6 +98,7 @@ text = "Сбой" [node name="Label" type="Label" parent="ref_G1"] self_modulate = Color(0.835294, 0.141176, 0.286275, 1) +layout_mode = 0 offset_left = 146.0 offset_top = 855.0 offset_right = 521.0 diff --git a/scenes/pribor-uf/pribor-uf.tscn b/scenes/pribor-uf/pribor-uf.tscn index dd8b218..9158fae 100644 --- a/scenes/pribor-uf/pribor-uf.tscn +++ b/scenes/pribor-uf/pribor-uf.tscn @@ -17,6 +17,7 @@ patch_margin_right = 16 patch_margin_bottom = 16 [node name="ref_bu1" type="NinePatchRect" parent="ref_uf"] +layout_mode = 0 offset_left = 281.0 offset_top = 138.0 offset_right = 591.0 @@ -47,6 +48,7 @@ fname = "ВК-110" state = 1 [node name="А8" type="Label" parent="ref_uf/ref_bu1"] +layout_mode = 0 offset_left = 21.0 offset_top = 12.0 offset_right = 39.0 @@ -54,6 +56,7 @@ offset_bottom = 31.0 text = "А8" [node name="А1" type="Label" parent="ref_uf/ref_bu1"] +layout_mode = 0 offset_left = 140.0 offset_top = 13.0 offset_right = 174.0 @@ -61,6 +64,7 @@ offset_bottom = 32.0 text = "БУ-1" [node name="ref_kassetav13" type="NinePatchRect" parent="ref_uf"] +layout_mode = 0 offset_left = 8.0 offset_top = 517.0 offset_right = 597.0 @@ -152,6 +156,7 @@ rname = "A12" state = 1 [node name="А1" type="Label" parent="ref_uf/ref_kassetav13"] +layout_mode = 0 offset_left = 21.0 offset_top = 15.0 offset_right = 55.0 @@ -159,6 +164,7 @@ offset_bottom = 34.0 text = "А1" [node name="А2" type="Label" parent="ref_uf/ref_kassetav13"] +layout_mode = 0 offset_left = 244.0 offset_top = 16.0 offset_right = 337.0 diff --git a/scenes/работа/работа.gd b/scenes/работа/работа.gd index 5a83c1b..082aa7d 100644 --- a/scenes/работа/работа.gd +++ b/scenes/работа/работа.gd @@ -133,6 +133,7 @@ func on_interfer_new(ecm): bip.set_track_visible(false) +## Обработчик выключения всех помех func interfer_off_all(): var bips: Array = get_children().filter(func(item): return item.name.is_valid_int()) for bip in bips: @@ -269,8 +270,10 @@ func _input(event) -> void: drag_fsm = DragFSM.DRAG emit_signal('drag_begin', event) else: + sel_fs_sector(event) drag_fsm = DragFSM.IDLE emit_signal('drag_end', event) + elif event is InputEventKey: if event.physical_keycode == KEY_SHIFT: shift_pressed = event.pressed @@ -288,3 +291,8 @@ func _on_zoom_complete(zoom: int) -> void: var prefix = $btn_zoom.get_meta('prefix') $btn_zoom/lbl.text = '%s %d' % [prefix, zoom] $btn_zoom.set_meta('zoom', zoom) + + +# Обработчик нажатия по сектору формирователя сигналов +func sel_fs_sector(event): + print_debug(event.position) From cf1b1a3694554ac52146273ec85e213766e3e6d9 Mon Sep 17 00:00:00 2001 From: MaD_CaT Date: Fri, 26 Jan 2024 14:18:50 +0300 Subject: [PATCH 2/4] =?UTF-8?q?=D0=94=D0=BE=D1=80=D0=B0=D0=B1=D0=BE=D1=82?= =?UTF-8?q?=D0=BA=D0=B0.=20=D0=9E=D0=BF=D1=8B=D1=82=D1=8B=20=D1=81=20?= =?UTF-8?q?=D1=80=D0=B0=D1=81=D0=BA=D1=80=D0=B0=D1=81=D0=BA=D0=BE=D0=B9=20?= =?UTF-8?q?=D0=B0=D0=BD=D1=82=D0=B5=D0=BD=D0=BD.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- project.godot | 2 ++ scenes/diagram/diagram.gd | 1 + scenes/работа/работа.gd | 58 +++++++++++++++++++++++++++++++++++++-- shaders/antenas.tres | 3 ++ 4 files changed, 62 insertions(+), 2 deletions(-) diff --git a/project.godot b/project.godot index df907a5..ba40565 100644 --- a/project.godot +++ b/project.godot @@ -27,6 +27,7 @@ config/map_server_addr="https://b.tile.openstreetmap.org" interfer/resend_timeout=1000.0 config/map_image_size_rto=Vector2i(512, 512) config/map_image_size_rls=Vector2i(1024, 1024) +interfer/center_offset=Vector2(0, 25) [autoload] @@ -80,6 +81,7 @@ enabled=PackedStringArray() [global] map_server_addr=false +center_offset=Vector2(0, 0) [gui] diff --git a/scenes/diagram/diagram.gd b/scenes/diagram/diagram.gd index c932ed7..2aa8238 100644 --- a/scenes/diagram/diagram.gd +++ b/scenes/diagram/diagram.gd @@ -23,3 +23,4 @@ func get_radius_inner_0() -> float: return material.get('shader_parameter/radiu func get_radius_inner_1() -> float: return material.get('shader_parameter/radius_inner_1') func set_view_mode(val: int): material.set('shader_parameter/mode', val); +func set_band_colors(val: Array): material.set('shader_parameter/ant_band_c', val) diff --git a/scenes/работа/работа.gd b/scenes/работа/работа.gd index db6548e..246bb65 100644 --- a/scenes/работа/работа.gd +++ b/scenes/работа/работа.gd @@ -36,7 +36,34 @@ signal drag_begin ## Вызывается в момент начала пе signal drag_continue ## Вызывается во время продолжения перетаскивания signal drag_end ## Вызывается в момент завершения перетаскивания +const fs_sectors: Dictionary = { + 0: [0.0, 90.0], + 1: [90.0, 180.0], + 2: [180.0, 270.0], + 3: [270.0, 360.0] +} +const fs_band_rto: Dictionary = { + 0: [200.0, 250.0], + 1: [250.0, 300.0], + 2: [300.0, 350.0], + 3: [350.0, 400.0], + 4: [400.0, 450.0], + 5: [450.0, 500.0], + 6: [500.0, 550.0], +} + +const fs_band_rls: Dictionary = { + 0: [480.0, 490.0], + 1: [490.0, 500.0], + 2: [500.0, 510.0], + 3: [510.0, 520.0], + 4: [520.0, 530.0], + 5: [530.0, 540.0], + 6: [540.0, 550.0], +} + +var fs_band = fs_band_rto ## Состояние перетаскивания enum DragFSM { DRAG, ## В процессе @@ -52,7 +79,12 @@ func on_threats_resized(threats: Dictionary): $count_all_pad/count_all.text = '% func on_threat_selected(th, ecm_btns): on_rto_threat_sel(th.id, ecm_btns) -func on_button_view_toggled(toggled: bool): signaller.emit_signal('map_mode_changed', int(toggled)) +func on_button_view_toggled(toggled: bool): + signaller.emit_signal('map_mode_changed', int(toggled)) + if toggled: + fs_band = fs_band_rls + else: + fs_band = fs_band_rto ## @@ -292,4 +324,26 @@ func _on_zoom_complete(zoom: int) -> void: # Обработчик нажатия по сектору формирователя сигналов func sel_fs_sector(event): - print_debug(event.position) + var center: Vector2 = $tilemap.position + var center_offset: Vector2 = ProjectSettings.get_setting('application/interfer/center_offset', Vector2i(0, 25)) + var angle: float = event.position.angle_to_point(center + center_offset) * 180/PI - 45.0 + if angle < 0: + angle +=360 + var distance: float = event.position.distance_to(center + center_offset) + var sector: int + var band: int + for sec in fs_sectors.values(): + if angle >= sec[0] and angle <= sec[1]: + sector = fs_sectors.find_key(sec) + for diap in fs_band.values(): + if distance >= diap[0] and distance <= diap[1]: + band = fs_band.find_key(diap) + var colors: Array = [] + var color0 = Vector3(0.38, 0.47, 0.51) + var color1 = Vector3(0.39, 0.44, 0.50) + for i in range(14): + colors.append(color0) + colors.append(color1) + $canvas.set_band_colors(colors) + print_debug(sector, band) + diff --git a/shaders/antenas.tres b/shaders/antenas.tres index 600570f..4b51e8f 100644 --- a/shaders/antenas.tres +++ b/shaders/antenas.tres @@ -41,6 +41,8 @@ const float ant_band_r1_4[] = {450.0, 530.0}; const float ant_band_r1_5[] = {500.0, 540.0}; const float ant_band_r1_6[] = {550.0, 550.0}; +const vec4 ant_band_colors[] = {vec4(0.38, 0.47, 0.51, 0.4),vec4(0.38, 0.47, 0.51, 0.4), vec4(0.38, 0.47, 0.51, 0.4), vec4(0.38, 0.47, 0.51, 0.4)}; +uniform vec3 ant_band_c[28]; const float d4 = 90.0; const float ds = 1.0; @@ -108,3 +110,4 @@ shader_parameter/radius_inner_0 = 200.0 shader_parameter/radius_inner_1 = 480.0 shader_parameter/radius_outter = 550.0 shader_parameter/mode = 0 +shader_parameter/ant_band_c = PackedVector3Array(0.38, 0.47, 0.51, 0.39, 0.44, 0.5, 0.38, 0.47, 0.51, 0.39, 0.44, 0.5, 0.38, 0.47, 0.51, 0.39, 0.44, 0.5, 0.38, 0.47, 0.51, 0.39, 0.44, 0.5, 0.38, 0.47, 0.51, 0.39, 0.44, 0.5, 0.38, 0.47, 0.51, 0.39, 0.44, 0.5, 0.38, 0.47, 0.51, 0.39, 0.44, 0.5, 0.38, 0.47, 0.51, 0.39, 0.44, 0.5, 0.38, 0.47, 0.51, 0.39, 0.44, 0.5, 0.38, 0.47, 0.51, 0.39, 0.44, 0.5, 0.38, 0.47, 0.51, 0.39, 0.44, 0.5, 0.38, 0.47, 0.51, 0.39, 0.44, 0.5, 0.38, 0.47, 0.51, 0.39, 0.44, 0.5, 0.38, 0.47, 0.51, 0.39, 0.44, 0.5) From 54e5f1bf371b881c5ebca871bee748d035cb8a7e Mon Sep 17 00:00:00 2001 From: MaD_CaT Date: Wed, 7 Feb 2024 10:15:30 +0300 Subject: [PATCH 3/4] =?UTF-8?q?=D0=94=D0=BE=D1=80=D0=B0=D0=B1=D0=BE=D1=82?= =?UTF-8?q?=D0=BA=D0=B0.=20=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B0=20=D0=B2=D0=BE=D0=B7=D0=BC=D0=BE=D0=B6=D0=BD=D0=BE?= =?UTF-8?q?=D1=81=D1=82=D1=8C=20=D1=80=D0=B0=D1=81=D0=BA=D1=80=D0=B0=D1=81?= =?UTF-8?q?=D0=BA=D0=B8=20=D1=81=D0=B5=D0=BA=D1=82=D0=BE=D1=80=D0=BE=D0=B2?= =?UTF-8?q?=20=D0=B0=D0=BD=D1=82=D0=B5=D0=BD=D0=BD=20=D0=B2=20=D1=80=D0=B0?= =?UTF-8?q?=D0=B7=D0=BD=D1=8B=D0=B5=20=D1=86=D0=B2=D0=B5=D1=82=D0=B0=20(?= =?UTF-8?q?=D0=B2=D1=8B=D0=B1=D0=BE=D1=80=20=D1=81=D0=B5=D0=BA=D1=82=D0=BE?= =?UTF-8?q?=D1=80=D0=B0,=20=D0=BD=D0=B0=D0=B7=D0=BD=D0=B0=D1=87=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D0=BF=D0=BE=D0=BC=D0=B5=D1=85=D0=B8)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- project.godot | 4 ++ scenes/bip/bip.gd | 1 - scenes/работа/работа.gd | 118 +++++++++++++++++++++++++++++++------- scenes/работа/работа.tscn | 43 +++++++++----- scripts/interfer.gd | 1 + scripts/signaller.gd | 4 ++ scripts/threats.gd | 8 ++- shaders/antenas.tres | 37 +++++++----- 8 files changed, 167 insertions(+), 49 deletions(-) diff --git a/project.godot b/project.godot index ba40565..e8afb7d 100644 --- a/project.godot +++ b/project.godot @@ -28,6 +28,10 @@ interfer/resend_timeout=1000.0 config/map_image_size_rto=Vector2i(512, 512) config/map_image_size_rls=Vector2i(1024, 1024) interfer/center_offset=Vector2(0, 25) +interfer/default_color0=Vector3(0.38, 0.47, 0.51) +interfer/default_color1=Vector3(0.39, 0.44, 0.5) +interfer/select_color=Vector3(1, 1, 1) +interfer/interfer_color=Vector3(0.58, 0.47, 0.51) [autoload] diff --git a/scenes/bip/bip.gd b/scenes/bip/bip.gd index 9a06c4f..64a4456 100644 --- a/scenes/bip/bip.gd +++ b/scenes/bip/bip.gd @@ -20,7 +20,6 @@ func set_ecm_visible(value: bool): $ecm_done.visible = value func _on_bip_gui_input(event): - print_debug(event) if event is InputEventMouseButton and event.pressed: match event.button_index: MOUSE_BUTTON_LEFT: diff --git a/scenes/работа/работа.gd b/scenes/работа/работа.gd index 246bb65..7b88d11 100644 --- a/scenes/работа/работа.gd +++ b/scenes/работа/работа.gd @@ -36,13 +36,14 @@ signal drag_begin ## Вызывается в момент начала пе signal drag_continue ## Вызывается во время продолжения перетаскивания signal drag_end ## Вызывается в момент завершения перетаскивания +## Границы секторов блоков ФС по пеленгу const fs_sectors: Dictionary = { 0: [0.0, 90.0], - 1: [90.0, 180.0], + 3: [90.0, 180.0], 2: [180.0, 270.0], - 3: [270.0, 360.0] -} + 1: [270.0, 360.0] } +## Границы секторов блоков ФС по частоте в режиме РТО const fs_band_rto: Dictionary = { 0: [200.0, 250.0], 1: [250.0, 300.0], @@ -50,9 +51,9 @@ const fs_band_rto: Dictionary = { 3: [350.0, 400.0], 4: [400.0, 450.0], 5: [450.0, 500.0], - 6: [500.0, 550.0], -} + 6: [500.0, 550.0] } +## Границы секторов блоков ФС по частоте в режиме РЛС const fs_band_rls: Dictionary = { 0: [480.0, 490.0], 1: [490.0, 500.0], @@ -60,10 +61,25 @@ const fs_band_rls: Dictionary = { 3: [510.0, 520.0], 4: [520.0, 530.0], 5: [530.0, 540.0], - 6: [540.0, 550.0], -} + 6: [540.0, 550.0] } -var fs_band = fs_band_rto + +const fs_freq: Dictionary = { + 0: [400.0, 1200.0], + 1: [1200.0, 2000.0], + 2: [2000.0, 2800.0], + 3: [2800.0, 3600.0], + 4: [3600.0, 4400.0], + 5: [4400.0, 5200.0], + 6: [5200.0, 6000.0] } + + +var fs_band = fs_band_rto # Текущий режим блоков ФС по частоте +var fs_default_colors: Array # Цвета по умолчанию для блоков ФС +var fs_colors: Array # Текущие цвета блоков ФС +var fs_selected: Array # Массив выбранных секторов +var th_selected: bool = false # Флаг, того, что выбрана цель. + ## Состояние перетаскивания enum DragFSM { DRAG, ## В процессе @@ -76,9 +92,11 @@ enum DragFSM { func on_threats_resized(threats: Dictionary): $count_all_pad/count_all.text = '%02d' % threats.size() +## Обработчик выбора цели func on_threat_selected(th, ecm_btns): on_rto_threat_sel(th.id, ecm_btns) +## Обработчик нажатия на кнопку вид func on_button_view_toggled(toggled: bool): signaller.emit_signal('map_mode_changed', int(toggled)) if toggled: @@ -109,10 +127,12 @@ func _ready(): max_zoom = ProjectSettings.get_setting('application/config/map_maximum_zoom', 19) drag_fsm = DragFSM.OFF $btn_zoom.set_meta('zoom', min_zoom - 1) - $btn_strob.button_connect('pressed', Callable(self, 'on_button_strobe_pressed')) + var btns_select: Array = $btns_select.get_children() + btns_select.any(func(btn): btn.button_connect('pressed', Callable(self, 'on_button_select').bind(btn, btns_select))) $btn_view.button_connect('toggled', Callable(self, 'on_button_view_toggled')) var nodes: Array = get_tree().get_nodes_in_group('группа-режим-помехи') nodes.any(func(btn): btn.button_connect('pressed', Callable(self, 'on_button_pressed').bind(btn, nodes))) + set_def_colors() threats.connect('threat_new', Callable(self, 'on_threat_new')) threats.connect('threat_lost', Callable(self, 'on_threat_lost')) threats.connect('threats_resized', Callable(self, 'on_threats_resized')) @@ -126,6 +146,7 @@ func _ready(): signaller.connect('interfer_off_all', Callable(self, 'interfer_off_all')) interfer.connect('interfer_update', Callable(self, 'on_interfer_new')) + func on_enter_tree() -> void: call_deferred('_on_btn_scale_pressed') call_deferred('on_button_strobe_pressed') @@ -141,7 +162,7 @@ func map_threat_to_bip(th: threats.Threat, bip: Control): radius_internal, radius_outter, freq_low, - freq_high) + freq_high) - bip.size / 2 ## Обработчик сигнала обновления цели @@ -161,9 +182,9 @@ func on_interfer_new(ecm): bip.set_ecm_visible(true) else: bip.set_ecm_visible(false) else: - print_debug() bip.set_ecm_visible(false) bip.set_track_visible(false) + set_fs_color(ecm) ## Обработчик выключения всех помех @@ -199,6 +220,9 @@ func on_rto_threat_sel(th_id, ecm_btns): item.set_sel_visible(false) for btn in ecm_btns: btn.set_disabled(false) + th_selected = true + await get_tree().create_timer(0.2).timeout + th_selected = false ## Обработчик снятия выбора РТО цели @@ -215,10 +239,16 @@ func on_rto_threat_unsel(th_id, ecm_btns): ## Обработчик нажатия кнопки "Строб". Управляет отображением строба func on_button_strobe_pressed() -> void: - drag_fsm = DragFSM.IDLE if $btn_strob.is_pressed() else DragFSM.OFF + drag_fsm = DragFSM.IDLE if $btns_select/btn_strob.is_pressed() else DragFSM.OFF $canvas.set_strob_visible(drag_fsm == DragFSM.IDLE) +## Поведение радиокнопок в группе. Управляет состоянием кнопок выбора целей +func on_button_select(btn_this, btn_others) -> void: + for btn_other in btn_others: btn_other.set_pressed(btn_this == btn_other) + on_button_strobe_pressed() + + ## Поведение радиокнопок в группе. Управляет состоянием кнопок в радиогруппе func on_button_pressed(btn_this, btn_others) -> void: for btn_other in btn_others: btn_other.set_pressed(btn_this == btn_other) @@ -299,7 +329,8 @@ func _input(event) -> void: drag_fsm = DragFSM.DRAG emit_signal('drag_begin', event) else: - sel_fs_sector(event) + if (event.button_index == MOUSE_BUTTON_LEFT) and (not $btns_select/btn_strob.pressed): + sel_fs_sector(event) drag_fsm = DragFSM.IDLE emit_signal('drag_end', event) @@ -332,18 +363,63 @@ func sel_fs_sector(event): var distance: float = event.position.distance_to(center + center_offset) var sector: int var band: int + var has_band: bool = false for sec in fs_sectors.values(): if angle >= sec[0] and angle <= sec[1]: sector = fs_sectors.find_key(sec) for diap in fs_band.values(): if distance >= diap[0] and distance <= diap[1]: band = fs_band.find_key(diap) - var colors: Array = [] - var color0 = Vector3(0.38, 0.47, 0.51) - var color1 = Vector3(0.39, 0.44, 0.50) - for i in range(14): - colors.append(color0) - colors.append(color1) - $canvas.set_band_colors(colors) - print_debug(sector, band) + has_band = true + if not has_band: + return + var fs_index = band * 4 + sector + var select_color: Vector3 = ProjectSettings.get_setting('application/interfer/select_color', Vector3(1.0, 1.0, 1.0)) + if not th_selected: + if len(fs_selected) > 0: + for fs_sector in fs_selected: + fs_colors[fs_sector[0]] = fs_sector[1] + fs_selected.clear() + fs_selected.append([fs_index, fs_colors[fs_index]]) + fs_colors[fs_index] = select_color + $canvas.set_band_colors(fs_colors) + signaller.emit_signal('rto_threat_unsel_all') + +## Закрашивание по умолчанию блоков ФС цветами из настроек +func set_def_colors(): + var color0: Vector3 = ProjectSettings.get_setting('application/interfer/default_color0', Vector3(0.38, 0.47, 0.51)) + var color1: Vector3 = ProjectSettings.get_setting('application/interfer/default_color1', Vector3(0.39, 0.44, 0.50)) + var col_arr: Array = [color0, color1] + var col = false + for i in range(7): + for j in range (4): + fs_default_colors.append(col_arr[int(col)]) + col = not col + col = not col + fs_colors = fs_default_colors + $canvas.set_band_colors(fs_default_colors) + + +func set_fs_color(ecm): + var color_ecm: Vector3 = ProjectSettings.get_setting('application/interfer/interfer_color', Vector3(0.58, 0.47, 0.51)) + var sector: int + var band: int + var angle: float = ecm.kni + 45.0 + if angle > 360.0: + angle -= 360.0 + for sec in fs_sectors.values(): + if float(angle) >= sec[0] and float(angle) <= sec[1]: + sector = fs_sectors.find_key(sec) + for diap in fs_freq.values(): + if ecm.params.has('freq'): + if ecm.params['freq'] >= diap[0] and ecm.params['freq'] <= diap[1]: + band = fs_freq.find_key(diap) + var fs_index = band * 4 + sector + var fs_is_selected: bool = false + for item in fs_selected: + if fs_index == item[0]: + fs_is_selected = true + if not fs_is_selected: + fs_colors[fs_index] = color_ecm + $canvas.set_band_colors(fs_colors) diff --git a/scenes/работа/работа.tscn b/scenes/работа/работа.tscn index 39a23b9..6f0cccc 100644 --- a/scenes/работа/работа.tscn +++ b/scenes/работа/работа.tscn @@ -25,10 +25,10 @@ col_red = Color(1, 0.568627, 0.431373, 0.239216) drag_scale_band = 0.05 drag_scale_width = 0.5 freq_high = 6000.0 -freq_low = 200.0 +freq_low = 400.0 radius_center = Vector2(560, 560) radius_internal = 200.0 -radius_outter = 400.0 +radius_outter = 350.0 strob_max_band = 15.538 strob_max_width = 90.0 strob_min_band = 0.1 @@ -104,17 +104,6 @@ size_flags_horizontal = 3 size_flags_vertical = 3 text = "Автомат" -[node name="btn_strob" parent="." instance=ExtResource("8_k0iv2")] -layout_mode = 2 -offset_left = 1034.0 -offset_top = 67.0 -offset_right = 1108.0 -offset_bottom = 121.0 -size_flags_horizontal = 3 -size_flags_vertical = 3 -tooltip_text = "Кнопка для выбора сектора при помощи клика мышкой" -text = "Строб" - [node name="btn_view" parent="." instance=ExtResource("8_k0iv2")] layout_mode = 2 offset_left = 874.0 @@ -135,6 +124,34 @@ metadata/zoom = 4 [node name="canvas" parent="." instance=ExtResource("11_b6su4")] +[node name="btns_select" type="GridContainer" parent="."] +layout_mode = 0 +offset_left = 1034.0 +offset_top = 65.0 +offset_right = 1108.0 +offset_bottom = 181.0 + +[node name="btn_strob" parent="btns_select" instance=ExtResource("8_k0iv2")] +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 +tooltip_text = "Кнопка для выбора сектора при помощи клика мышкой" +text = "Строб" + +[node name="btn_threats" parent="btns_select" instance=ExtResource("8_k0iv2")] +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 +tooltip_text = "Кнопка для выбора сектора при помощи клика мышкой" +text = "Цель" + +[node name="btn_fs_sector" parent="btns_select" instance=ExtResource("8_k0iv2")] +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 +tooltip_text = "Кнопка для выбора сектора при помощи клика мышкой" +text = "Сектор" + [connection signal="drag_begin" from="." to="." method="_on_drag_begin"] [connection signal="drag_continue" from="." to="." method="_on_drag_continue"] [connection signal="pressed" from="btn_zoom" to="." method="_on_btn_scale_pressed"] diff --git a/scripts/interfer.gd b/scripts/interfer.gd index f648894..ede1099 100644 --- a/scripts/interfer.gd +++ b/scripts/interfer.gd @@ -100,6 +100,7 @@ func _ready(): signaller.connect('interfer_new', Callable(self, 'send_ecm').bind(unit)) signaller.connect('interfer_off_all', Callable(self, 'on_interfer_off_all').bind(unit, ecms)) + # Проверяет состояние отправки пакета и если не доставлен, повторяет отправку func on_timer_check_state(unit, ecms, resend_timeout): var tick = Time.get_ticks_msec() diff --git a/scripts/signaller.gd b/scripts/signaller.gd index 7b2a1f4..27cffad 100644 --- a/scripts/signaller.gd +++ b/scripts/signaller.gd @@ -32,6 +32,10 @@ signal rto_threat_sel (th_id: int) signal rto_threat_unsel (th_id: int) +## Вызывается, когда пользователь снимает выделение со всех целей +signal rto_threat_unsel_all () + + ## Вызывается, когда пользователь выбирает помеху ## [param btn] - Нажатая кнопка помехи. signal interfer_init (btn: PanelContainer) diff --git a/scripts/threats.gd b/scripts/threats.gd index b83a4b9..98ce183 100644 --- a/scripts/threats.gd +++ b/scripts/threats.gd @@ -55,6 +55,7 @@ func _ready() -> void: timer_check_lost.start(repsettings.ThreatParams.time_lost / 1000.0) signaller.connect('rto_threat_sel', Callable(self, 'on_rto_threat_sel').bind(threats)) signaller.connect('rto_threat_unsel', Callable(self, 'on_rto_threat_unsel').bind(threats)) + signaller.connect('rto_threat_unsel_all', Callable(self, 'on_rto_threat_unsel_all').bind(threats)) signaller.connect('threat_selected', Callable(self, 'on_threat_selected').bind(threats)) signaller.connect('interfer_init', Callable(self, 'on_interfer_init').bind(threats)) @@ -74,6 +75,12 @@ func on_timer_check_lost(time_lost: int, threats: Dictionary): func on_rto_threat_unsel(th_id, threats): threats[th_id].selected = false +## Снимает выделение со всех целей +func on_rto_threat_unsel_all(threats): + for th in threats.values(): + signaller.emit_signal('rto_threat_unsel', th.id) + + ## Выбирает цель, если нажать по отметке цели. func on_rto_threat_sel(th_id, threats): on_threat_selected(threats[th_id], threats) @@ -95,7 +102,6 @@ func on_interfer_init(btn, threats): signaller.emit_signal('interfer_create', btn, sel_threats) - ## Производит приём целей func on_data_capsrpb_received(unit: capsrpb.CapsRpb, threats: Dictionary): if not unit.json_dic.has('ts'): return diff --git a/shaders/antenas.tres b/shaders/antenas.tres index 4b51e8f..87248d1 100644 --- a/shaders/antenas.tres +++ b/shaders/antenas.tres @@ -41,7 +41,6 @@ const float ant_band_r1_4[] = {450.0, 530.0}; const float ant_band_r1_5[] = {500.0, 540.0}; const float ant_band_r1_6[] = {550.0, 550.0}; -const vec4 ant_band_colors[] = {vec4(0.38, 0.47, 0.51, 0.4),vec4(0.38, 0.47, 0.51, 0.4), vec4(0.38, 0.47, 0.51, 0.4), vec4(0.38, 0.47, 0.51, 0.4)}; uniform vec3 ant_band_c[28]; const float d4 = 90.0; @@ -65,14 +64,26 @@ void sector(inout vec4 c, vec2 uv, vec2 center, float a, float da, float r0, flo } -void antenas(inout vec4 c, vec2 uv, vec2 p0, int cnt, float r0, float r1, vec4 c0, vec4 c1) +void antenas(inout vec4 c, vec2 uv, vec2 p0, int cnt, float r0, float r1, inout int index) { float da = 180.0 / float(cnt); for (int i = -cnt; i <= cnt; i ++) { + vec4 col; + int j = index; + if (i == 2) + { + index--; + j = index - 3; + } + col.x = ant_band_c[j].x; + col.y = ant_band_c[j].y; + col.z = ant_band_c[j].z; + index++; + col.a = 0.5; float v = float(i & 1); - vec4 col = v * c0 + (1.0f - v) * c1; - sector(c, uv, p0, float(i) * da, da, r0, r1, col); + vec4 color = v * col + (1.0f - v) * col; + sector(c, uv, p0, float(i) * da, da, r0, r1, color); } } @@ -88,15 +99,15 @@ void fragment() ivec2 isz = textureSize(TEXTURE, 0); vec2 uv = UV * vec2(float(isz.x), float(isz.y)); // координаты текущей точки в пикселях COLOR = vec4(0, 0, 0, 0); //texture(TEXTURE, UV); // Цвет текущей точки - + int index = 0; // Сетка антенн - antenas(COLOR, uv, pc0, ant_band_count_0, ant_band_r0_0[mode], ant_band_r1_0[mode], color1, color0); - antenas(COLOR, uv, pc0, ant_band_count_1, ant_band_r0_1[mode], ant_band_r1_1[mode], color0, color1); - antenas(COLOR, uv, pc0, ant_band_count_2, ant_band_r0_2[mode], ant_band_r1_2[mode], color1, color0); - antenas(COLOR, uv, pc0, ant_band_count_3, ant_band_r0_3[mode], ant_band_r1_3[mode], color0, color1); - antenas(COLOR, uv, pc0, ant_band_count_4, ant_band_r0_4[mode], ant_band_r1_4[mode], color1, color0); - antenas(COLOR, uv, pc0, ant_band_count_5, ant_band_r0_5[mode], ant_band_r1_5[mode], color0, color1); - antenas(COLOR, uv, pc0, ant_band_count_6, ant_band_r0_6[mode], ant_band_r1_6[mode], color1, color0); + antenas(COLOR, uv, pc0, ant_band_count_0, ant_band_r0_0[mode], ant_band_r1_0[mode], index); + antenas(COLOR, uv, pc0, ant_band_count_1, ant_band_r0_1[mode], ant_band_r1_1[mode], index); + antenas(COLOR, uv, pc0, ant_band_count_2, ant_band_r0_2[mode], ant_band_r1_2[mode], index); + antenas(COLOR, uv, pc0, ant_band_count_3, ant_band_r0_3[mode], ant_band_r1_3[mode], index); + antenas(COLOR, uv, pc0, ant_band_count_4, ant_band_r0_4[mode], ant_band_r1_4[mode], index); + antenas(COLOR, uv, pc0, ant_band_count_5, ant_band_r0_5[mode], ant_band_r1_5[mode], index); + antenas(COLOR, uv, pc0, ant_band_count_6, ant_band_r0_6[mode], ant_band_r1_6[mode], index); } " @@ -110,4 +121,4 @@ shader_parameter/radius_inner_0 = 200.0 shader_parameter/radius_inner_1 = 480.0 shader_parameter/radius_outter = 550.0 shader_parameter/mode = 0 -shader_parameter/ant_band_c = PackedVector3Array(0.38, 0.47, 0.51, 0.39, 0.44, 0.5, 0.38, 0.47, 0.51, 0.39, 0.44, 0.5, 0.38, 0.47, 0.51, 0.39, 0.44, 0.5, 0.38, 0.47, 0.51, 0.39, 0.44, 0.5, 0.38, 0.47, 0.51, 0.39, 0.44, 0.5, 0.38, 0.47, 0.51, 0.39, 0.44, 0.5, 0.38, 0.47, 0.51, 0.39, 0.44, 0.5, 0.38, 0.47, 0.51, 0.39, 0.44, 0.5, 0.38, 0.47, 0.51, 0.39, 0.44, 0.5, 0.38, 0.47, 0.51, 0.39, 0.44, 0.5, 0.38, 0.47, 0.51, 0.39, 0.44, 0.5, 0.38, 0.47, 0.51, 0.39, 0.44, 0.5, 0.38, 0.47, 0.51, 0.39, 0.44, 0.5, 0.38, 0.47, 0.51, 0.39, 0.44, 0.5) +shader_parameter/ant_band_c = PackedVector3Array(0.38, 0.47, 0.51, 0.39, 0.44, 0.5, 0.38, 0.47, 0.51, 0.39, 0.44, 0.5, 0.39, 0.44, 0.5, 0.38, 0.47, 0.51, 0.39, 0.44, 0.5, 0.38, 0.47, 0.51, 0.38, 0.47, 0.51, 0.39, 0.44, 0.5, 0.38, 0.47, 0.51, 0.39, 0.44, 0.5, 0.39, 0.44, 0.5, 0.38, 0.47, 0.51, 0.39, 0.44, 0.5, 0.38, 0.47, 0.51, 0.38, 0.47, 0.51, 0.39, 0.44, 0.5, 0.38, 0.47, 0.51, 0.39, 0.44, 0.5, 0.39, 0.44, 0.5, 0.38, 0.47, 0.51, 0.39, 0.44, 0.5, 0.38, 0.47, 0.51, 0.38, 0.47, 0.51, 0.39, 0.44, 0.5, 0.38, 0.47, 0.51, 0.39, 0.44, 0.5) From 123abce7411a7a6d7d695610293089f647f3d431 Mon Sep 17 00:00:00 2001 From: MaD_CaT Date: Fri, 16 Feb 2024 13:54:23 +0300 Subject: [PATCH 4/4] =?UTF-8?q?=D0=94=D0=BE=D1=80=D0=B0=D0=B1=D0=BE=D1=82?= =?UTF-8?q?=D0=BA=D0=B0.=20=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B0=20=D0=B2=D0=BE=D0=B7=D0=BC=D0=BE=D0=B6=D0=BD=D0=BE?= =?UTF-8?q?=D1=81=D1=82=D1=8C=20=D0=B2=D0=BA=D0=BB=D1=8E=D1=87=D0=B0=D1=82?= =?UTF-8?q?=D1=8C=20=D0=BF=D0=BE=D0=BC=D0=B5=D1=85=D1=83=20=D0=BF=D0=BE=20?= =?UTF-8?q?=D1=81=D0=B5=D0=BA=D1=82=D0=BE=D1=80=D1=83.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scenes/bip/bip.gd | 2 +- scenes/button-flat/nine-patch-button.gd | 5 +- scenes/frame-ecm-list/frm-ecm-list.tscn | 2 +- scenes/frame-ecm-list/scroll-ecm-list.gd | 2 + scenes/frame-ecm-params/scroll-ecm-params.gd | 2 +- scenes/frm_ecm_list.gd | 17 -- scenes/работа/работа.gd | 223 ++++++++++++------- scenes/работа/работа.tscn | 4 + scripts/interfer.gd | 106 +++++---- scripts/signaller.gd | 14 +- scripts/threats.gd | 6 +- 11 files changed, 228 insertions(+), 155 deletions(-) delete mode 100644 scenes/frm_ecm_list.gd diff --git a/scenes/bip/bip.gd b/scenes/bip/bip.gd index 64a4456..0174251 100644 --- a/scenes/bip/bip.gd +++ b/scenes/bip/bip.gd @@ -23,7 +23,7 @@ func _on_bip_gui_input(event): if event is InputEventMouseButton and event.pressed: match event.button_index: MOUSE_BUTTON_LEFT: - signaller.emit_signal('rto_threat_sel', name.to_int()) + signaller.emit_signal('bip_pressed', name.to_int()) MOUSE_BUTTON_RIGHT: if selected: signaller.emit_signal('rto_threat_unsel', name.to_int()) diff --git a/scenes/button-flat/nine-patch-button.gd b/scenes/button-flat/nine-patch-button.gd index 1e19007..4ff8c1d 100644 --- a/scenes/button-flat/nine-patch-button.gd +++ b/scenes/button-flat/nine-patch-button.gd @@ -23,10 +23,9 @@ var save_modulate: Color $button.set_disabled(val) $back.disabled = val if val: - save_modulate = $state.modulate - $state.modulate *= Color(1.0, 1.0, 1.0, 0.5) + $state.modulate.a = 0.5 else: - $state.modulate = save_modulate + $state.modulate.a = 1.0 get: return $button.disabled diff --git a/scenes/frame-ecm-list/frm-ecm-list.tscn b/scenes/frame-ecm-list/frm-ecm-list.tscn index f9775f6..4c89832 100644 --- a/scenes/frame-ecm-list/frm-ecm-list.tscn +++ b/scenes/frame-ecm-list/frm-ecm-list.tscn @@ -63,7 +63,7 @@ editor_description = "Кнопка для принудительного вкл layout_mode = 2 size_flags_horizontal = 3 size_flags_vertical = 3 -text = "JTIDS" +text = "СПРС" metadata/rfi_name = "ozp1" [node name="btn_kupd" parent="grd_forced" groups=["группа-принудительно"] instance=ExtResource("4_7ys3c")] diff --git a/scenes/frame-ecm-list/scroll-ecm-list.gd b/scenes/frame-ecm-list/scroll-ecm-list.gd index a417d70..f473773 100644 --- a/scenes/frame-ecm-list/scroll-ecm-list.gd +++ b/scenes/frame-ecm-list/scroll-ecm-list.gd @@ -53,6 +53,8 @@ func on_row_pressed(i_row: int): if interfer.thrs.has(ecm.ispp): signaller.emit_signal('rto_threat_sel', interfer.thrs[ecm.ispp]) else: + if interfer.fs.has(ecm.ispp): + signaller.emit_signal('fs_selected', ecm) signaller.emit_signal('interfer_selected', ecm) diff --git a/scenes/frame-ecm-params/scroll-ecm-params.gd b/scenes/frame-ecm-params/scroll-ecm-params.gd index 1d7447d..09fa292 100644 --- a/scenes/frame-ecm-params/scroll-ecm-params.gd +++ b/scenes/frame-ecm-params/scroll-ecm-params.gd @@ -70,7 +70,7 @@ func on_interfer_selected(ecm): func on_ecm_update(): - for item in range(len(TABLE_PARAMS)): + for item in len(TABLE_PARAMS): $table.set_node_text(1, item, '') $table.set_node_editable(1, item, false) if $table.has_meta('ecm') == false: return diff --git a/scenes/frm_ecm_list.gd b/scenes/frm_ecm_list.gd deleted file mode 100644 index cf95ef2..0000000 --- a/scenes/frm_ecm_list.gd +++ /dev/null @@ -1,17 +0,0 @@ -extends NinePatchRect - - -# Called when the node enters the scene tree for the first time. -func _ready(): - $grd_forced/btn_cancel.button_connect('pressed', Callable(self, 'on_btn_cancel_pressed').bind($grd_forced/btn_cancel)) - - -func on_btn_cancel_pressed(btn): - signaller.emit_signal('interfer_off_all') - await get_tree().create_timer(0.1).timeout - btn.pressed = false - - -# Called every frame. 'delta' is the elapsed time since the previous frame. -func _process(delta): - pass diff --git a/scenes/работа/работа.gd b/scenes/работа/работа.gd index 7b88d11..035650d 100644 --- a/scenes/работа/работа.gd +++ b/scenes/работа/работа.gd @@ -21,28 +21,22 @@ extends Panel @export var window_0_id: int ## Идетификатор окна. Присваивается godot от 0 до количества созданных окон -var drag_button: MouseButton ## Кнопка мыши нажатая при перетаскивании -var drag_fsm: DragFSM = DragFSM.IDLE ## Текущее состояние перетаскивания -var drag_pos_begin: Vector2 ## Точка начала перетаскивания -var max_zoom: int ## Максимальный уровень детализации -var min_zoom: int ## Минимальный уровень детализации -var shift_pressed: bool ## Кнопка SHIFT нажата -var strob_band_begin: float ## Ширина строба в момент начала перетаскивания -var strob_dir_begin: float ## Направление антенны в момент начала перетаскивания -var strob_width_begin: float ## Ширина строба по углу в момент начала перетаскивания +var drag_button: MouseButton ## Кнопка мыши нажатая при перетаскивании +var drag_fsm: DragFSM = DragFSM.IDLE ## Текущее состояние перетаскивания +var btn_select: BtnSel = BtnSel.THREAT ## Текущее состояние кнопки выбора цели +var drag_pos_begin: Vector2 ## Точка начала перетаскивания +var max_zoom: int ## Максимальный уровень детализации +var min_zoom: int ## Минимальный уровень детализации +var shift_pressed: bool ## Кнопка SHIFT нажата +var strob_band_begin: float ## Ширина строба в момент начала перетаскивания +var strob_dir_begin: float ## Направление антенны в момент начала перетаскивания +var strob_width_begin: float ## Ширина строба по углу в момент начала перетаскивания signal drag_begin ## Вызывается в момент начала перетаскивания signal drag_continue ## Вызывается во время продолжения перетаскивания signal drag_end ## Вызывается в момент завершения перетаскивания -## Границы секторов блоков ФС по пеленгу -const fs_sectors: Dictionary = { - 0: [0.0, 90.0], - 3: [90.0, 180.0], - 2: [180.0, 270.0], - 1: [270.0, 360.0] } - ## Границы секторов блоков ФС по частоте в режиме РТО const fs_band_rto: Dictionary = { 0: [200.0, 250.0], @@ -63,6 +57,12 @@ const fs_band_rls: Dictionary = { 5: [530.0, 540.0], 6: [540.0, 550.0] } +## Границы секторов блоков ФС по пеленгу +const fs_sectors: Dictionary = { + 0: [0.0, 90.0], + 3: [90.0, 180.0], + 2: [180.0, 270.0], + 1: [270.0, 360.0] } const fs_freq: Dictionary = { 0: [400.0, 1200.0], @@ -73,12 +73,10 @@ const fs_freq: Dictionary = { 5: [4400.0, 5200.0], 6: [5200.0, 6000.0] } - var fs_band = fs_band_rto # Текущий режим блоков ФС по частоте var fs_default_colors: Array # Цвета по умолчанию для блоков ФС -var fs_colors: Array # Текущие цвета блоков ФС -var fs_selected: Array # Массив выбранных секторов -var th_selected: bool = false # Флаг, того, что выбрана цель. +var fs_selected: Dictionary # Словарь выбранных секторов +var fs_active: Dictionary # Словарь секторов назначенных на подавление ## Состояние перетаскивания enum DragFSM { @@ -87,6 +85,12 @@ enum DragFSM { OFF ## Выключено } +## Состояние перетаскивания +enum BtnSel { + SECTOR, ## В процессе + THREAT, ## Не активно, ожидание + FS ## Выключено + } ## Обработчик сигнала изменения списка целей func on_threats_resized(threats: Dictionary): $count_all_pad/count_all.text = '%02d' % threats.size() @@ -139,11 +143,13 @@ func _ready(): threats.connect('threat_update', Callable(self, 'on_threat_update')) signaller.connect('zoom_complete', Callable(self, '_on_zoom_complete')) signaller.connect('rto_threat_sel', Callable(self, 'on_rto_threat_sel').bind(nodes)) + signaller.connect('bip_pressed', Callable(self, 'on_bip_pressed').bind(nodes)) signaller.connect('rto_threat_unsel', Callable(self, 'on_rto_threat_unsel').bind(nodes)) signaller.connect('threat_selected', Callable(self, 'on_threat_selected').bind(nodes)) signaller.connect('interfer_selected', Callable(self, 'on_interfer_selected').bind(nodes)) signaller.connect('interfer_new', Callable(self, 'on_interfer_new')) - signaller.connect('interfer_off_all', Callable(self, 'interfer_off_all')) + signaller.connect('interfer_off_all', Callable(self, 'on_interfer_off_all')) + signaller.connect('fs_selected', Callable(self, 'on_fs_selected')) interfer.connect('interfer_update', Callable(self, 'on_interfer_new')) @@ -174,25 +180,28 @@ func on_threat_update(th): ## Обработчик выбора помехи для цели func on_interfer_new(ecm): if interfer.thrs.has(ecm.ispp): - var th_id = interfer.thrs[ecm.ispp] - var bip = get_node('%d' % th_id) - if ecm.krp != interfer.INTERFER_OFF: - bip.set_track_visible(true) - if ecm.svk == 1: - bip.set_ecm_visible(true) - else: bip.set_ecm_visible(false) - else: - bip.set_ecm_visible(false) - bip.set_track_visible(false) + if interfer.thrs.has(ecm.ispp): + var th_id = interfer.thrs[ecm.ispp] + var bip = get_node('%d' % th_id) + if ecm.krp != interfer.INTERFER_OFF: + bip.set_track_visible(true) + if ecm.svk == 1: + bip.set_ecm_visible(true) + else: bip.set_ecm_visible(false) + else: + bip.set_ecm_visible(false) + bip.set_track_visible(false) set_fs_color(ecm) ## Обработчик выключения всех помех -func interfer_off_all(): +func on_interfer_off_all(): var bips: Array = get_children().filter(func(item): return item.name.is_valid_int()) for bip in bips: bip.set_ecm_visible(false) bip.set_track_visible(false) + fs_active.clear() + update_fs_colors() ## Обработчик сигнала обнаружения цели @@ -210,31 +219,33 @@ func on_threat_lost(th) -> void: bip.free() +## обработчик нажатия на цель на экране +func on_bip_pressed(th_id, _ecm_btns): + if btn_select == BtnSel.THREAT: + signaller.emit_signal('rto_threat_sel', th_id) + + ## Обработчик выбора РТО цели func on_rto_threat_sel(th_id, ecm_btns): var bips: Array = get_children().filter(func(item): return item.name.is_valid_int()) for item in bips: if th_id == item.name.to_int(): item.set_sel_visible(true) + unsel_fs_all(false) else: item.set_sel_visible(false) for btn in ecm_btns: btn.set_disabled(false) - th_selected = true - await get_tree().create_timer(0.2).timeout - th_selected = false ## Обработчик снятия выбора РТО цели -func on_rto_threat_unsel(th_id, ecm_btns): +func on_rto_threat_unsel(th_id, _ecm_btns): var bips: Array = get_children().filter(func(item): return item.name.is_valid_int()) for item in bips: if th_id == item.name.to_int(): item.set_sel_visible(false) break - for btn in ecm_btns: - btn.set_pressed(false) - btn.set_disabled(true) + set_ecm_btns_state(true) ## Обработчик нажатия кнопки "Строб". Управляет отображением строба @@ -246,13 +257,20 @@ func on_button_strobe_pressed() -> void: ## Поведение радиокнопок в группе. Управляет состоянием кнопок выбора целей func on_button_select(btn_this, btn_others) -> void: for btn_other in btn_others: btn_other.set_pressed(btn_this == btn_other) + btn_select = btn_this.get_meta('state') on_button_strobe_pressed() + signaller.emit_signal('rto_threat_unsel_all') + unsel_fs_all(true) + set_ecm_btns_state(true) ## Поведение радиокнопок в группе. Управляет состоянием кнопок в радиогруппе func on_button_pressed(btn_this, btn_others) -> void: + var fs_arr: Array = [] for btn_other in btn_others: btn_other.set_pressed(btn_this == btn_other) - signaller.emit_signal('interfer_init', btn_this) + for key in fs_selected.keys(): + fs_arr.append(get_fs_param(key)) + signaller.emit_signal('interfer_init', btn_this, fs_arr) ## Управляет состоянием кнопок в радиогруппе при выборе помехи @@ -329,7 +347,7 @@ func _input(event) -> void: drag_fsm = DragFSM.DRAG emit_signal('drag_begin', event) else: - if (event.button_index == MOUSE_BUTTON_LEFT) and (not $btns_select/btn_strob.pressed): + if btn_select == BtnSel.FS: sel_fs_sector(event) drag_fsm = DragFSM.IDLE emit_signal('drag_end', event) @@ -351,40 +369,7 @@ func _on_zoom_complete(zoom: int) -> void: var prefix = $btn_zoom.get_meta('prefix') $btn_zoom/lbl.text = '%s %d' % [prefix, zoom] $btn_zoom.set_meta('zoom', zoom) - -# Обработчик нажатия по сектору формирователя сигналов -func sel_fs_sector(event): - var center: Vector2 = $tilemap.position - var center_offset: Vector2 = ProjectSettings.get_setting('application/interfer/center_offset', Vector2i(0, 25)) - var angle: float = event.position.angle_to_point(center + center_offset) * 180/PI - 45.0 - if angle < 0: - angle +=360 - var distance: float = event.position.distance_to(center + center_offset) - var sector: int - var band: int - var has_band: bool = false - for sec in fs_sectors.values(): - if angle >= sec[0] and angle <= sec[1]: - sector = fs_sectors.find_key(sec) - for diap in fs_band.values(): - if distance >= diap[0] and distance <= diap[1]: - band = fs_band.find_key(diap) - has_band = true - if not has_band: - return - var fs_index = band * 4 + sector - var select_color: Vector3 = ProjectSettings.get_setting('application/interfer/select_color', Vector3(1.0, 1.0, 1.0)) - if not th_selected: - if len(fs_selected) > 0: - for fs_sector in fs_selected: - fs_colors[fs_sector[0]] = fs_sector[1] - fs_selected.clear() - fs_selected.append([fs_index, fs_colors[fs_index]]) - fs_colors[fs_index] = select_color - $canvas.set_band_colors(fs_colors) - signaller.emit_signal('rto_threat_unsel_all') - ## Закрашивание по умолчанию блоков ФС цветами из настроек func set_def_colors(): @@ -397,12 +382,92 @@ func set_def_colors(): fs_default_colors.append(col_arr[int(col)]) col = not col col = not col - fs_colors = fs_default_colors $canvas.set_band_colors(fs_default_colors) +# Обработчик нажатия по сектору формирователя сигналов +func sel_fs_sector(event): + if (event.button_index == MOUSE_BUTTON_LEFT) or (event.button_index == MOUSE_BUTTON_RIGHT): + var center: Vector2 = $tilemap.position + var center_offset: Vector2 = ProjectSettings.get_setting('application/interfer/center_offset', Vector2i(0, 25)) + var angle: float = event.position.angle_to_point(center + center_offset) * 180/PI - 45.0 + if angle < 0: + angle +=360 + var distance: float = event.position.distance_to(center + center_offset) + var sector: int + var band: int + var has_band: bool = false + for sec in fs_sectors.values(): + if angle >= sec[0] and angle <= sec[1]: + sector = fs_sectors.find_key(sec) + for diap in fs_band.values(): + if distance >= diap[0] and distance <= diap[1]: + band = fs_band.find_key(diap) + has_band = true + if not has_band: + return + var fs_index = band * 4 + sector + if event.button_index == MOUSE_BUTTON_LEFT: + fs_selected[fs_index] = null + else: + fs_selected.erase(fs_index) + update_fs_colors() + signaller.emit_signal('rto_threat_unsel_all') + var btn_state = len(fs_selected) == 0 + set_ecm_btns_state(btn_state) + + func set_fs_color(ecm): + var fs_index = get_fs_index(ecm) + if ecm.krp != interfer.INTERFER_OFF: + fs_active[fs_index] = null + else: + fs_active.erase(fs_index) + update_fs_colors() + + +func update_fs_colors(): + var fs_colors = fs_default_colors.duplicate() var color_ecm: Vector3 = ProjectSettings.get_setting('application/interfer/interfer_color', Vector3(0.58, 0.47, 0.51)) + var color_select: Vector3 = ProjectSettings.get_setting('application/interfer/select_color', Vector3(1.0, 1.0, 1.0)) + for key in fs_active.keys(): + fs_colors[key] = color_ecm + for key in fs_selected.keys(): + fs_colors[key] = color_select + $canvas.set_band_colors(fs_colors) + + +func unsel_fs_all(need_btns_off: bool): + fs_selected.clear() + update_fs_colors() + if need_btns_off: + set_ecm_btns_state(true) + + +func set_ecm_btns_state(value: bool): + var btns: Array = get_tree().get_nodes_in_group('группа-режим-помехи') + for btn in btns: + btn.set_pressed(false) + btn.set_disabled(value) + + +func get_fs_param(index: int) -> Array: + var freq = (fs_freq[index / 4][0] + fs_freq[index / 4][1])/2 + var sector = (fs_sectors[index % 4][0] + fs_sectors[index % 4][1])/2 - 45.0 + if sector < 0: + sector += 360.0 + var width = fs_freq[index / 4][1] - fs_freq[index / 4][0] + return [sector, freq, width, index] + + +func on_fs_selected(ecm): + var fs_index = get_fs_index(ecm) + fs_selected.clear() + fs_selected[fs_index] = null + update_fs_colors() + + +func get_fs_index(ecm): var sector: int var band: int var angle: float = ecm.kni + 45.0 @@ -416,10 +481,4 @@ func set_fs_color(ecm): if ecm.params['freq'] >= diap[0] and ecm.params['freq'] <= diap[1]: band = fs_freq.find_key(diap) var fs_index = band * 4 + sector - var fs_is_selected: bool = false - for item in fs_selected: - if fs_index == item[0]: - fs_is_selected = true - if not fs_is_selected: - fs_colors[fs_index] = color_ecm - $canvas.set_band_colors(fs_colors) + return fs_index diff --git a/scenes/работа/работа.tscn b/scenes/работа/работа.tscn index 6f0cccc..0b335d2 100644 --- a/scenes/работа/работа.tscn +++ b/scenes/работа/работа.tscn @@ -137,6 +137,7 @@ size_flags_horizontal = 3 size_flags_vertical = 3 tooltip_text = "Кнопка для выбора сектора при помощи клика мышкой" text = "Строб" +metadata/state = 0 [node name="btn_threats" parent="btns_select" instance=ExtResource("8_k0iv2")] layout_mode = 2 @@ -144,6 +145,8 @@ size_flags_horizontal = 3 size_flags_vertical = 3 tooltip_text = "Кнопка для выбора сектора при помощи клика мышкой" text = "Цель" +pressed = true +metadata/state = 1 [node name="btn_fs_sector" parent="btns_select" instance=ExtResource("8_k0iv2")] layout_mode = 2 @@ -151,6 +154,7 @@ size_flags_horizontal = 3 size_flags_vertical = 3 tooltip_text = "Кнопка для выбора сектора при помощи клика мышкой" text = "Сектор" +metadata/state = 2 [connection signal="drag_begin" from="." to="." method="_on_drag_begin"] [connection signal="drag_continue" from="." to="." method="_on_drag_continue"] diff --git a/scripts/interfer.gd b/scripts/interfer.gd index ede1099..da8addb 100644 --- a/scripts/interfer.gd +++ b/scripts/interfer.gd @@ -2,7 +2,6 @@ extends Node ## Представление помехи - ## Режимы помехи const ITERFER_MODE = { 'off': ['Откл', ['freq', 'width']], @@ -20,26 +19,29 @@ const ITERFER_MODE = { 'k1': ['K1', ['freq', 'width', 'dur', 'period']], 'ozp1': ['ОЗП-1', ['freq', 'width']] } +const TYPE_TH = ['th','fs'] const ID_INTERFERS_LEN = 63 ## Размер пула номеров целей const INTERFER_OFF = 'off' const STATE_TSMT = 5 ## Значение svk для цели, когда ответ ещё не получен var msg_ss: int = 0 ## счётчик сообщений var id_array: Array ## Массив id воздействий var thrs: Dictionary ## Словарь воздействия для целей, ключ - id воздействия +var fs: Dictionary ## Словарь воздействий для секторов, ключ - id воздействия ## Сеанс помехи class Interfer: - var ss: int = 0 ## Счётчик сообщений. - var ispp: int = 0 ## Индекс сеанса. - var svk: = 0 ## Состояние сеанса. Ответ КАПСРПБ. Возможные значения в [param ITERFER_STATE]. - var krp: String = '' ## Тип помехи. Возможные значения в [param INTERFER_MODE]. - var powp: float = 0.0 ## Мощность излучения выраженная в процентах. - var kni: = 0.0 ## Курсовой угол направления излучения. - var params: = {} ## Параметры помехи. - var get_params: Array[String] ## Запрос массива параметров (список запрошенных параметров). - var retss: int ## Значение счётчика сообщения в котором был произведён запрос массива параметров. - var tick_tx: int ## Тик время обновления цели, мс. + var ss: int = 0 ## Счётчик сообщений. + var ispp: int = 0 ## Индекс сеанса. + var svk: = 0 ## Состояние сеанса. Ответ КАПСРПБ. Возможные значения в [param ITERFER_STATE]. + var krp: String = '' ## Тип помехи. Возможные значения в [param INTERFER_MODE]. + var powp: float = 0.0 ## Мощность излучения выраженная в процентах. + var kni: = 0.0 ## Курсовой угол направления излучения. + var params: = {} ## Параметры помехи. + var get_params: Array[String] ## Запрос массива параметров (список запрошенных параметров). + var retss: int ## Значение счётчика сообщения в котором был произведён запрос массива параметров. + var tick_tx: int ## Тик время обновления цели, мс. + var type_th: String = '' ## Тип объекта по которой поставлена помеха func _to_string() -> String: return 'номер: %d название: %s частота: %0.1f МГц пеленг: %0.1f гр.' % [ispp, ITERFER_MODE[krp][0], params['freq'], kni] @@ -138,46 +140,60 @@ func on_data_capsrpb_received(unit: capsrpb.CapsRpb, ecms: Dictionary): ## Вызыватся, когда пользователь выбрал помеху и выбраны цели -func on_interfer_create(btn, sel_threats, unit, ecms): +func on_interfer_create(btn, sel_threats, fs_arr, _unit, ecms): for item in sel_threats: - var ispp: int = 0 - var interfer_name: String = btn.get_meta('rfi_name') var param: Dictionary = {} var kni: float = item.aoa + var id = item.id param['freq'] = item.freq param['width'] = item.width - if interfer_name == 'k1': - param['dur'] = 1.0 # Необходимо добавить параметры управления - param['period'] = 1.0 # Необходимо добавить параметры управления - var key = thrs.find_key(item.id) - if key != null: - ispp = key - else: - if interfer_name == 'off': - return - ispp = pop_id() - if ispp == 0: return - msg_ss += 1 - var ecm: Interfer - if ecms.has(ispp): - ecm = ecms[ispp] - else: - ecm = Interfer.new() - ecm.ispp = ispp - ecms[ispp] = ecm - ecm.svk = STATE_TSMT # Подготовка к передаче сообщения - ecm.ss = msg_ss - ecm.kni = kni - ecm.krp = interfer_name - ecm.params = param - ecm.powp = 100.0 # Необходимо добавить управление мощностью - thrs[ispp] = item.id - signaller.emit_signal('interfer_new', ecm) + interfer_create(btn, ecms, param, kni, id, thrs, item, TYPE_TH[0]) + + for item in fs_arr: + var param: Dictionary = {} + var kni: float = item[0] + var id = item[3] + param['freq'] = item[1] + param['width'] = item[2] + interfer_create(btn, ecms, param, kni, id, fs, item, TYPE_TH[1]) + + +func interfer_create(btn, ecms, param, kni, id, dict, item, type_th): + var ispp: int = 0 + var interfer_name: String = btn.get_meta('rfi_name') + if interfer_name == 'k1': + param['dur'] = 1.0 # Необходимо добавить параметры управления + param['period'] = 1.0 # Необходимо добавить параметры управления + var key = dict.find_key(id) + if key != null: + ispp = key + else: if interfer_name == 'off': - signaller.emit_signal('interfer_off', ecm, ecms, thrs) - push_id(ecm.ispp) - thrs.erase(ispp) - ecm.tick_tx = Time.get_ticks_msec() + return + ispp = pop_id() + if ispp == 0: return + dict[ispp] = id + msg_ss += 1 + var ecm: Interfer + if ecms.has(ispp): + ecm = ecms[ispp] + else: + ecm = Interfer.new() + ecm.ispp = ispp + ecms[ispp] = ecm + ecm.svk = STATE_TSMT # Подготовка к передаче сообщения + ecm.ss = msg_ss + ecm.kni = kni + ecm.krp = interfer_name + ecm.params = param + ecm.powp = 100.0 # Необходимо добавить управление мощностью + ecm.type_th = type_th + signaller.emit_signal('interfer_new', ecm) + if interfer_name == 'off': + signaller.emit_signal('interfer_off', ecm, ecms, thrs) + push_id(ecm.ispp) + thrs.erase(ispp) + ecm.tick_tx = Time.get_ticks_msec() func send_ecm(ecm, unit): diff --git a/scripts/signaller.gd b/scripts/signaller.gd index 27cffad..93dace7 100644 --- a/scripts/signaller.gd +++ b/scripts/signaller.gd @@ -27,6 +27,11 @@ signal full_screen(id: int) signal rto_threat_sel (th_id: int) +## Вызывается, когда пользователь нажимает на значёк цели +## [param th_id] - Отметка цели на экране +signal bip_pressed (th_id: int) + + ## Вызывается, когда пользователь снимает выделение с цели ## [param th_id] - Отметка цели на экране signal rto_threat_unsel (th_id: int) @@ -38,13 +43,13 @@ signal rto_threat_unsel_all () ## Вызывается, когда пользователь выбирает помеху ## [param btn] - Нажатая кнопка помехи. -signal interfer_init (btn: PanelContainer) +signal interfer_init (btn: PanelContainer, fs_arr: Array) ## Вызывается, когда выбраны цели для постановки помех ## [param btn] - Нажатая кнопка помехи.[br] ## [param sel_threats] - Cписок целей. -signal interfer_create (btn: PanelContainer, sel_threats: Array) +signal interfer_create (btn: PanelContainer, sel_threats: Array, fs_arr: Array) ## Вызывается, когда создалась новая помеха @@ -67,6 +72,11 @@ signal interfer_off_all () signal interfer_selected (ecm: interfer.Interfer) +## Вызывается, когда отключается выбираем помеху по сектору в таблице +## [param ecm] - Выбранная помеха +signal fs_selected(ecm: interfer.Interfer) + + ## Вызывается при запросе изменения уровня детализации карты ## [param zoom] - Вновь установленный уровень детализации signal zoom_changed(zoom: int) diff --git a/scripts/threats.gd b/scripts/threats.gd index 98ce183..cb4f4ca 100644 --- a/scripts/threats.gd +++ b/scripts/threats.gd @@ -93,13 +93,13 @@ func on_threat_selected(th, threats): ## Формирует список выбранных целей для включения помехи -func on_interfer_init(btn, threats): +func on_interfer_init(btn, fs_arr, threats): var sel_threats: Array = [] for threat in threats.values(): if threat.selected: sel_threats.append(threat) - if len(sel_threats): - signaller.emit_signal('interfer_create', btn, sel_threats) + if len(sel_threats) or (len(fs_arr)): + signaller.emit_signal('interfer_create', btn, sel_threats, fs_arr) ## Производит приём целей