From b3672369b9112a52529c6b17ff3f04a07d1ca711 Mon Sep 17 00:00:00 2001 From: MaD_CaT Date: Wed, 19 Jul 2023 11:43:08 +0300 Subject: [PATCH 1/6] =?UTF-8?q?=D0=A0=D0=B0=D0=B7=D1=80=D0=B0=D0=B1=D0=BE?= =?UTF-8?q?=D1=82=D0=BA=D0=B0.=20=D0=9D=D0=B0=20=D0=B2=D0=BA=D0=BB=D0=B0?= =?UTF-8?q?=D0=B4=D0=BA=D0=B5=20=D0=AD=D0=9C=D0=A1=20=D0=B4=D0=BE=D0=B1?= =?UTF-8?q?=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D1=8B=20=D1=82=D0=B0=D0=B1=D0=BB?= =?UTF-8?q?=D0=B8=D1=86=D1=8B=20=D0=B2=D1=85=D0=BE=D0=B4=D0=BE=D0=B2=20?= =?UTF-8?q?=D0=B8=20=D0=B2=D1=8B=D1=85=D0=BE=D0=B4=D0=BE=D0=B2.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- data/кнопка-эмс-0.png | Bin 0 -> 574 bytes data/кнопка-эмс-0.png.import | 34 ++ data/кнопка-эмс-1.png | Bin 0 -> 509 bytes data/кнопка-эмс-1.png.import | 34 ++ data/эмс-бланк-замыкание.png | Bin 0 -> 989 bytes data/эмс-бланк-замыкание.png.import | 34 ++ data/эмс-бланк-перем.png | Bin 0 -> 704 bytes data/эмс-бланк-перем.png.import | 34 ++ data/эмс-бланк-пост.png | Bin 0 -> 483 bytes data/эмс-бланк-пост.png.import | 34 ++ data/эмс-бланк.png | Bin 0 -> 787 bytes data/эмс-бланк.png.import | 34 ++ project.godot | 2 +- scenes/header.tscn | 6 +- scenes/nine-patch-button.gd | 30 +- scenes/tab_switch.tscn | 7 +- scenes/ЭМС.gd | 101 +++++ scenes/ЭМС.tscn | 34 ++ scenes/журнал.gd | 20 +- scenes/кнопка-3.tscn | 13 + scenes/кнопка-4.tscn | 13 + scenes/кнопка-эмс.gd | 51 +++ scenes/кнопка-эмс.tscn | 50 ++ scenes/контроль.gd | 58 +-- scenes/переключатель-эмс.tscn | 24 + scenes/работа.gd | 142 +++--- scenes/рамка.gd | 12 +- scenes/состояния-эмс.gd | 5 + scenes/состояния-эмс.tscn | 40 ++ scenes/ячейка-1.tscn | 7 + scenes/ячейка-2.tscn | 11 + scripts/threats.gd | 46 +- scripts/tools.gd | 62 +-- scripts/yems_devs.gd | 43 ++ table/table.gd | 681 ++++++++++++++-------------- 35 files changed, 1129 insertions(+), 533 deletions(-) create mode 100644 data/кнопка-эмс-0.png create mode 100644 data/кнопка-эмс-0.png.import create mode 100644 data/кнопка-эмс-1.png create mode 100644 data/кнопка-эмс-1.png.import create mode 100644 data/эмс-бланк-замыкание.png create mode 100644 data/эмс-бланк-замыкание.png.import create mode 100644 data/эмс-бланк-перем.png create mode 100644 data/эмс-бланк-перем.png.import create mode 100644 data/эмс-бланк-пост.png create mode 100644 data/эмс-бланк-пост.png.import create mode 100644 data/эмс-бланк.png create mode 100644 data/эмс-бланк.png.import create mode 100644 scenes/ЭМС.gd create mode 100644 scenes/ЭМС.tscn create mode 100644 scenes/кнопка-3.tscn create mode 100644 scenes/кнопка-4.tscn create mode 100644 scenes/кнопка-эмс.gd create mode 100644 scenes/кнопка-эмс.tscn create mode 100644 scenes/переключатель-эмс.tscn create mode 100644 scenes/состояния-эмс.gd create mode 100644 scenes/состояния-эмс.tscn create mode 100644 scenes/ячейка-1.tscn create mode 100644 scenes/ячейка-2.tscn create mode 100644 scripts/yems_devs.gd diff --git a/data/кнопка-эмс-0.png b/data/кнопка-эмс-0.png new file mode 100644 index 0000000000000000000000000000000000000000..6efdc17ebeebb825f729ce83378522316ea3cfbc GIT binary patch literal 574 zcmV-E0>S->P)6#o5Xb+Mcc*uR zU~-~`AQrJqqc#>6VhXW{rJZFyKnh#^1~z^G!6xmsVk-!OLM#FjLJ*XI+6W2ea>@N{ z{tt%d<-GUKfn|4Qc4l^FcVrw9ryBxGkycbx4}p>Re4jh38`rNh<1i z*_t+t5uu1UHNGgR0~8T)lJ`c08bdxgumK$KHw=KM<78$rykq6-z=cHb0*}r64zwG4 z1{7X@1@@+p`3M|%T{Q9(cn+K zi$K&hx?bE2j29H?t=G0C-#Bw}JB&THl8# zfVsvc4wwfHfnUJ=G5ou(MgW&)t)Y?DFH$J?fo}y3 zm9-<{3$Wuv-*tx=x?ldkj&Ef{qvt#%>7-86ZThGA>`J6M{~1a814(m0AwZdSLI3~& M07*qoM6N<$f*Z#5l>h($ literal 0 HcmV?d00001 diff --git a/data/кнопка-эмс-0.png.import b/data/кнопка-эмс-0.png.import new file mode 100644 index 0000000..deda1ed --- /dev/null +++ b/data/кнопка-эмс-0.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bvxv33noium2h" +path="res://.godot/imported/кнопка-эмс-0.png-55c9c814b93a55a54b5133cafc1cc584.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://data/кнопка-эмс-0.png" +dest_files=["res://.godot/imported/кнопка-эмс-0.png-55c9c814b93a55a54b5133cafc1cc584.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/data/кнопка-эмс-1.png b/data/кнопка-эмс-1.png new file mode 100644 index 0000000000000000000000000000000000000000..481c192dfa6707f4f108eaa60d00fa33261d20ef GIT binary patch literal 509 zcmVa{8f357&NL_#EJBqv_Z`Dx~o&3Rm&-80E% zXLt6$vopIhvr+^BjeY~z3g?PaNoh1Ksp7mzDy+35Qc>ppr#DH;Vyr9`b)%Wd%<4Yw zlT-#WGy4kHnwgR*JUOrqRQXLGz-At%9mQ9^`5Mq0%vXR_mpuZV$(8|`^LM~aj=ULj z3RIoXk}L(bfqE-*iW^v?5$H8+ExJkzhN8No;750GVh_JW-4%-d<58$Xk;2*ek8PJiO;(%`86?g#_a^$m~ zjR1z)&7l_XJ3+#J0PchFZXTxXis9oC;21aqMq8~-s)vn$_su%Z>=w9^R57z_uMjn_ zm;YDseY2VmySz!#S4`1O{nK1}CQ{6QMv{I2EKI48Vxai(00000NkvXXu0mjfF*e#Q literal 0 HcmV?d00001 diff --git a/data/кнопка-эмс-1.png.import b/data/кнопка-эмс-1.png.import new file mode 100644 index 0000000..cb68680 --- /dev/null +++ b/data/кнопка-эмс-1.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://nfpish471rjj" +path="res://.godot/imported/кнопка-эмс-1.png-5000e69bb949ac3e094bd419f59b8ee8.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://data/кнопка-эмс-1.png" +dest_files=["res://.godot/imported/кнопка-эмс-1.png-5000e69bb949ac3e094bd419f59b8ee8.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/data/эмс-бланк-замыкание.png b/data/эмс-бланк-замыкание.png new file mode 100644 index 0000000000000000000000000000000000000000..e1e8864f54425553ac0d45f3f06215ca688617a7 GIT binary patch literal 989 zcmV<310wv1P)lX!iNvHfgY-JI5#HCb~!jWBu#USvGVAV zyEMb$Fd&XYlB6BX&v)r`76^iwK;#%0@!-KT;C6J*rw4oi+@`Km@_d~<-^AL#fI}S) zbKnA~4u`?y;Iy%}OP=@1^8t;<5{*Uz{04kI-G3e|LG>2aevC0fQQX6rO;p!_O<)3g z|9(NMWhsh~x^4koppWVRW0on30iDh}grO3KipcjsaS_bgG1eYoOhKMsqbTOEb`jNq z2U{ZuHi_dAt=1{lzJYT+oEreks1C4pk)lY*b46s2I6fi_$3FXWU{$q4Sw5vGBC>3W zvh3kp0wh3>AQ%wGo3z{Ov|5Ka*TuOdj2Ylu517R{D9eiY(3}Zw< z^^mIi73aRixt}m*3+E27HpAL_3K2}oN|Du7WjwYRQ{Y?*ya4tQIU)=*qDYCNh$w0h zh7F>q;nzwSW{4aC`@jpFOEIQkJhrmBs(8JKrroZ?VGOj-stfJ{AK}~`jF~0R9YJu4 zNJ<=M7}H@qPRR2ZV`g#g4p0FtVB@TMhr@iTCK0NLhyquETfh?VJ}~f2o?r~9?qcl- z=eB4z4=Kwor>EB`%N})|pn3zC2X6T4{TWyXeiso%l?aik`t*Sn;1lnVc&d+4-KMT5 zJ*WByWtmb{31xW`YnOd{EP9`NetsQT@YxC?zCb3N&UzK;105g*w$FM@b)qI^c|=_s ztc|huIjWnUg=PO;^!|O|Z(tVH;tb4lngUz?-XdVn({QF9sOHqQrLNVhLIxaq`xJBu zxCYcdUaHW1`OZebH^7gc))d(F!Cuite@3Unq4oAD=r5j51&)A`h}=XKQPrcbsNZb9~1UeZ=00000 LNkvXXu0mjfxwg~l literal 0 HcmV?d00001 diff --git a/data/эмс-бланк-замыкание.png.import b/data/эмс-бланк-замыкание.png.import new file mode 100644 index 0000000..1de097f --- /dev/null +++ b/data/эмс-бланк-замыкание.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dvl3sq036gn75" +path="res://.godot/imported/эмс-бланк-замыкание.png-4318b52796ef34b4e1884210148903b1.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://data/эмс-бланк-замыкание.png" +dest_files=["res://.godot/imported/эмс-бланк-замыкание.png-4318b52796ef34b4e1884210148903b1.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/data/эмс-бланк-перем.png b/data/эмс-бланк-перем.png new file mode 100644 index 0000000000000000000000000000000000000000..832a346c43b74227b515c53c9cf68391fef00acd GIT binary patch literal 704 zcmV;x0zdtUP);Yay;z%HDV_MxwdqyYuaC97&gb>E50I7xfjTnu@p+IN> zQ$Vu@1Ylj#8-TGma$r(trm&-hdl;F-MG7Bz|866E`P5emr+w(?n8r`M<@Ne^wY~z_ z-Ud$9fC!8h!LwYL$GVF^24keGj5<2*XZ+>{ja&U-$2qxdxPG4bYY%AL%gductT8Zz zQoav{mp~w$qd_}}N!!OHQ8{cV*{=;k*}3}1E1|L6zkk`6ZUDDSPO}&>7c#IP28v1= zS7s7O61J;CDnBk^21v=mrJ33S?p}-wb#OgtW*c^ZI!a3Z6ReGgLKQjN2rXM&Nq)^G z*tWe_Wcp=b-MkH3f|hZ!0&G*#Cgztw1%I~z+%yV;t!`a~GBfwkdSv@4($5O8JBEkF zJx;2t*M+u_n*AL}(Q!#=L(+>yFN_;ULBtXwfWgA)HW!7)qFTD{UJA`~6M(Q18sBW6 zH9lO+ky~?ddLFnh6Oke~AF>ARTIi=NO2MeWPJsa_%z64M@EK5H5bsi`1N(B0WRb#? zsp+5z?=y9}e5VVg&*`qARus3&^VM0M zyGZi2DN(S;On>QCon|CG(fTvsAfQ_Q=gb%nWo>(Dl$_T9sH)oyaK!So&<{n&30X7A mML9*;&yxR`m#-_I{@NeyKQyNAyD-840000yF`#vO$+8m?wl8J-D{utd5V7x+ zUISh>5eY~czas&1*6k}|kCa}3Q{bt}=Uhv=E0+gpG&(JYnjJ+Tftby11P=hVUxAY< z<8v^-J)M35ery*Bjec&as zRM%I)6>lJk|0wUB%zj&zf}i-8V%n8!{u^y18Nk!&pwZ=DukLrxEp1T><<3&Q6&;dN zT|Y=NHdT4|9OLmh@XHXggF=M8Aney%Au^ys=tWABAbC9g2K)h3&FeFzL*RqjRyN+X z&N?0y1GET7#~9lbT=#Qkm#$#D<4He6>W8clsL?fs<<)L=5DCofZLQJhv%xC-T9fQ8 z=8z21Y<2;B%wf#Qn_%yi*e>_$2!b=~0e2wlq<8)@{&@!*L6v0Oi>E Z@-MY$$Qk0s4~+l-002ovPDHLkV1gnn*~tI^ literal 0 HcmV?d00001 diff --git a/data/эмс-бланк-пост.png.import b/data/эмс-бланк-пост.png.import new file mode 100644 index 0000000..9f1b42e --- /dev/null +++ b/data/эмс-бланк-пост.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bwddxs24es81u" +path="res://.godot/imported/эмс-бланк-пост.png-26bac763879d76be257d6217d43b0164.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://data/эмс-бланк-пост.png" +dest_files=["res://.godot/imported/эмс-бланк-пост.png-26bac763879d76be257d6217d43b0164.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/data/эмс-бланк.png b/data/эмс-бланк.png new file mode 100644 index 0000000000000000000000000000000000000000..7762ebc2db5f43fd8a6d0942e97aac69bf29d02c GIT binary patch literal 787 zcmV+u1MK{XP)sV5G*eQ-dJRzof-TK{sy77enS6ZwD8LF0S1GS!6HE+ z1Z)UOnBZ9QjBqmD?`EMMsU;jow%?}cs_J*{tNW_7y}kWnFc>V_RydFaV8lfjP-Cp; zjFHsXW_0nRj7drYJRA=H(%#jvJRgbb6Ogm&pbabm|MYsj?`&7OBqU9N2{4lM2QdALswzntP}I=Aq*9Xe z#-_3!+d$WLQ7g?q160K6SS6x*Ljwl+Heagg{;!-J1Qr>mtPznCg3z8vRP%aoq(G_CnDN_t|S)H zxqMw(xLjTRt+3m`0+7xtv#p3IB;5i!KR$judGqYq$PsPMMCgBxun99#D5VeMqoc8; z9zaC2fRx+Ls;asn>GtCN`~9e@ZdI0Zbtmc?eqHv>wj)w+c{$5gR@$TI&)=41*{!Oo z$Zh8*Cnue69zE)>KX|ZU5D{47+_So4)ttNPS!2F_)ou#-qH2P%S>svU2?N>4~5 RU+(|_002ovPDHLkV1o2ifWH6$ literal 0 HcmV?d00001 diff --git a/data/эмс-бланк.png.import b/data/эмс-бланк.png.import new file mode 100644 index 0000000..a6a29c1 --- /dev/null +++ b/data/эмс-бланк.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://belwchvdktrw0" +path="res://.godot/imported/эмс-бланк.png-da5900abaf207dcfac692be656729ba5.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://data/эмс-бланк.png" +dest_files=["res://.godot/imported/эмс-бланк.png-da5900abaf207dcfac692be656729ba5.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/project.godot b/project.godot index dda7022..004f49b 100644 --- a/project.godot +++ b/project.godot @@ -29,6 +29,7 @@ Log="*res://addons/godot-logger/scripts/logger.gd" Table="*res://table/table.gd" Bip="*res://scenes/bip.tscn" Threats="*res://scripts/threats.gd" +YemsDevs="*res://scripts/yems_devs.gd" [debug] @@ -38,7 +39,6 @@ file_logging/enable_file_logging=true window/size/viewport_width=1600 window/size/viewport_height=1200 -window/size/mode=3 window/subwindows/embed_subwindows=false window/stretch/mode="viewport" window/vsync/vsync_mode=false diff --git a/scenes/header.tscn b/scenes/header.tscn index 0762438..7782157 100644 --- a/scenes/header.tscn +++ b/scenes/header.tscn @@ -1,8 +1,4 @@ -[gd_scene format=2] +[gd_scene format=3 uid="uid://bnfmccbgrffps"] [node name="Label" type="Label"] -margin_right = 122.0 -margin_bottom = 34.0 -custom_colors/font_color = Color( 1, 0.596078, 0.4, 1 ) -valign = 1 clip_text = true diff --git a/scenes/nine-patch-button.gd b/scenes/nine-patch-button.gd index f810563..3179f10 100644 --- a/scenes/nine-patch-button.gd +++ b/scenes/nine-patch-button.gd @@ -4,28 +4,28 @@ extends PanelContainer @export var texture_state0: Texture2D = preload('res://data/кнопка-квадрат-0.png'): - set(val): $state.set_texture(val) + set(val): $state.set_texture(val) @export var texture_state1: Texture2D = preload('res://data/кнопка-квадрат-1.png'): - set(val): $state.set_texture(val) + set(val): $state.set_texture(val) @export var text: String = '': - set(val): $button.set_text(val) - get: return $button.get_text() + set(val): $button.set_text(val) + get: return $button.get_text() @export var pressed: bool = false: - set(val): $button.set_pressed(val) - get: return $button.is_pressed() + set(val): $button.set_pressed(val) + get: return $button.is_pressed() @export var toggle_mode: bool = false: - set(val): - if is_inside_tree(): - $button.set_toggle_mode(val) - get: return $button.is_toggle_mode() + set(val): + if is_inside_tree(): + $button.set_toggle_mode(val) + get: return $button.is_toggle_mode() func set_text (val: String): $button.set_text(val) @@ -33,8 +33,8 @@ func set_pressed (val: bool): $button.set_pressed(val) func set_toggle_mode (val: bool): - if is_inside_tree(): - $button.set_toggle_mode(val) + if is_inside_tree(): + $button.set_toggle_mode(val) func get_text(): return $button.get_text() @@ -43,9 +43,9 @@ func is_toggle_mode(): return $button.is_toggle_mode() func _on_button_toggled(val: bool): - if val: $state.set_texture(texture_state1) - else: $state.set_texture(texture_state0) + if val: $state.set_texture(texture_state1) + else: $state.set_texture(texture_state0) func button_connect(button_signal: String, proc: Callable): - $button.connect(button_signal, proc) + $button.connect(button_signal, proc) diff --git a/scenes/tab_switch.tscn b/scenes/tab_switch.tscn index 3363bfb..aec5f96 100644 --- a/scenes/tab_switch.tscn +++ b/scenes/tab_switch.tscn @@ -1,8 +1,9 @@ -[gd_scene load_steps=4 format=3 uid="uid://3slb0i3pvowc"] +[gd_scene load_steps=5 format=3 uid="uid://3slb0i3pvowc"] [ext_resource type="PackedScene" uid="uid://b276iygic5itk" path="res://scenes/работа.tscn" id="1_uow82"] [ext_resource type="PackedScene" uid="uid://lwmw4egynmd1" path="res://scenes/контроль.tscn" id="2_83m7a"] [ext_resource type="PackedScene" uid="uid://trt0q8th3bn2" path="res://scenes/журнал.tscn" id="3_hgnup"] +[ext_resource type="PackedScene" uid="uid://c6uls7q4e2m4h" path="res://scenes/ЭМС.tscn" id="4_2bmbm"] [node name="tab_switch" type="TabContainer"] offset_right = 1600.0 @@ -18,3 +19,7 @@ layout_mode = 2 [node name="журнал" parent="." instance=ExtResource("3_hgnup")] visible = false layout_mode = 2 + +[node name="ЭМС" parent="." instance=ExtResource("4_2bmbm")] +visible = false +layout_mode = 2 diff --git a/scenes/ЭМС.gd b/scenes/ЭМС.gd new file mode 100644 index 0000000..a0a5e4a --- /dev/null +++ b/scenes/ЭМС.gd @@ -0,0 +1,101 @@ +extends Panel + +var TableHeader = preload('res://table/header.tscn') +var TableNode = preload('res://scenes/ячейка-1.tscn') +var CellYemsButton = preload('res://scenes/кнопка-эмс.tscn') +var CellLineEdit = preload('res://scenes/ячейка-2.tscn') +var CellState = preload('res://scenes/состояния-эмс.tscn') + +var g_in_devices : Dictionary # Словарь с входными устройствами КЭМС +var g_out_devices : Dictionary # Словарь с выходными устройствами КЭМС + +# Таблица с данными для входов, первое значение - индекс устройства в ячейке КЭМС +const INPUT_ROWS = [ + [1,['НРЛС МР-231S, УИЗП', 'X31', '0', '0']], + [2,['НРЛС МР-231S, Строб ЭМС', 'X32', '0', '0']], + [3,['НРЛС МР-231-3, УИЗП', 'X34', '0', '0']], + [4,['НРЛС МР-231-3, Строб ЭМС', 'X35', '0', '0']], + [5,['ЦИСВС-1010, УИЗП', 'X43', '0', '0']], + [6,['4302-01, 4302-04, УИЗП', 'X46', '0', '0']]] + +# Таблица с данными для выходов, первое значение - индекс устройства в ячейке КЭМС +const OUTPUT_ROWS = [ + [41,['НРЛС МР-231S, БИ', 'X61', '0', '0']], + [42,['НРЛС МР-231S', 'X62', '0', '0']], + [43,['НРЛС МР-231-3, БИ', 'X64', '0', '0']], + [44,['НРЛС МР-231-3', 'X65', '0', '0']], + [45,['ЦИСВС-1010, БИ', 'X63', '0', '0']], + [46,['4302-01, 4302-04, БИ', 'X66', '0', '0']], + [48,['НРЛС 11111111', 'X69', '0', '0']], + [49,['НРЛС-222222, БИ', 'X62', '0', '0']]] + +func _ready() -> void: + var posx: int = 30 + var posy: int = 30 + $tbl_in.set_position(Vector2(posx,posy)) + $tbl_out.set_position(Vector2(posx,len(INPUT_ROWS)*35+posy+10)) + $lbl_online.set_position(Vector2(posx,posy-25)) + init_tbl_out() + init_tbl_in() + $tbl_in.connect('row_pressed', Callable(self, 'on_row_pressed')) + + +func on_row_pressed(i_row: int): + $tbl_in.set_row_selected(i_row, false) + + +func init_tbl_out(): + $tbl_out.set_header([TableHeader, TableHeader, TableHeader, TableHeader, TableHeader, TableHeader, TableHeader]) + $tbl_out.set_header_text(['Выходы', 'Разъём', 'мкс', 'мкс', 'Состояние', 'Частота, Мгц', 'Режим']) + for item in OUTPUT_ROWS: + $tbl_out.add_row([TableNode, TableNode, CellLineEdit, CellLineEdit, CellState, CellLineEdit, CellLineEdit]) + var row_index : int = $tbl_out.get_rows_count() - 1 + var params : Array = item[1] + var out_dev = YemsDevs.OutDev.new(item[0], params, row_index) + g_out_devices[item[0]] = out_dev + for i in range(len(params)): + var node = $tbl_out.get_node2(i, row_index) + node.text = params[i] + $tbl_out.set_columns_min_size([270, 100, 70, 70, 100, 100, 100]) + + +func init_tbl_in(): + var header_type: Array = [TableHeader, TableHeader, TableHeader, TableHeader, TableHeader, TableHeader, TableHeader] + var header_text: Array = ['Входы', 'Разъём', 'мкс', 'мкс', 'Состояние', 'Частота, Мгц',' '] + var row_type: Array = [TableNode, TableNode, CellLineEdit, CellLineEdit, CellState, CellLineEdit, TableNode] + var yams_alligment_in: Array = [ HORIZONTAL_ALIGNMENT_LEFT, HORIZONTAL_ALIGNMENT_CENTER, HORIZONTAL_ALIGNMENT_CENTER, HORIZONTAL_ALIGNMENT_CENTER, HORIZONTAL_ALIGNMENT_CENTER, HORIZONTAL_ALIGNMENT_CENTER, HORIZONTAL_ALIGNMENT_CENTER] + var column_size: Array = [270, 100, 70, 70, 100, 100, 100] + var dot_collums: Array + var column_offset: int = 7 + for i in range(len(OUTPUT_ROWS)): + header_type.append(TableHeader) + header_text.append('...') + row_type.append(CellYemsButton) + yams_alligment_in.append(HORIZONTAL_ALIGNMENT_LEFT) + column_size.append(25) + dot_collums.append(column_offset+i) + $tbl_in.set_header(header_type) + $tbl_in.set_header_text(header_text) + $tbl_in.set_columns_alignments(yams_alligment_in) + for item in INPUT_ROWS: + $tbl_in.add_row(row_type) + var row_index : int = $tbl_in.get_rows_count() - 1 + var params : Array = item[1] + var in_dev: YemsDevs.InDev = YemsDevs.InDev.new(item[0], params, row_index) + g_in_devices[item[0]] = in_dev + for i in range(len(params)): + var node = $tbl_in.get_node2(i, row_index) + node.text = params[i] + for i_col in dot_collums: + var btn = $tbl_in.get_node2(i_col, row_index) + var out_dev = g_out_devices[OUTPUT_ROWS[i_col-column_offset][0]] + in_dev.out_dots = [btn, out_dev] + btn.button_connect('pressed', Callable(self, 'on_dot_button').bind(i_col, row_index)) + + $tbl_in.set_columns_min_size(column_size) + + +func on_dot_button(i: int, j: int): + """ Вызывается при нажатии на кнопку-точку (соединение) + i - индекс входа, j - индекс выхода """ + print('on_dot_button(%d, %d)' % [i, j]) diff --git a/scenes/ЭМС.tscn b/scenes/ЭМС.tscn new file mode 100644 index 0000000..8d09eae --- /dev/null +++ b/scenes/ЭМС.tscn @@ -0,0 +1,34 @@ +[gd_scene load_steps=3 format=3 uid="uid://c6uls7q4e2m4h"] + +[ext_resource type="Script" path="res://scenes/ЭМС.gd" id="1_t1s35"] +[ext_resource type="Script" path="res://table/table.gd" id="2_6x8yw"] + +[node name="ЭМС" type="Panel"] +offset_right = 1598.0 +offset_bottom = 1201.0 +script = ExtResource("1_t1s35") + +[node name="lbl_online" type="Label" parent="."] +layout_mode = 0 +offset_left = 30.0 +offset_top = 4.0 +offset_right = 166.0 +offset_bottom = 30.0 +theme_override_colors/font_color = Color(1, 0, 0, 1) +text = "Ячейка не на связи" + +[node name="tbl_in" type="GridContainer" parent="."] +layout_mode = 0 +offset_left = 30.0 +offset_top = 46.0 +offset_right = 825.0 +offset_bottom = 182.0 +script = ExtResource("2_6x8yw") + +[node name="tbl_out" type="GridContainer" parent="."] +layout_mode = 0 +offset_left = 46.0 +offset_top = 588.0 +offset_right = 598.0 +offset_bottom = 688.0 +script = ExtResource("2_6x8yw") diff --git a/scenes/журнал.gd b/scenes/журнал.gd index d6cb83d..214a680 100644 --- a/scenes/журнал.gd +++ b/scenes/журнал.gd @@ -2,19 +2,19 @@ extends Control func _on_clear_button_down() -> void: - $content.clear() - Log.info('содержание журнала очищено оператором') + $content.clear() + Log.info('содержание журнала очищено оператором') func _on_btn_save_button_down() -> void: - $content.hide() - $btn_clear.hide() - $btn_save.hide() - $dlg_file.show() + $content.hide() + $btn_clear.hide() + $btn_save.hide() + $dlg_file.show() func _on_dlg_file_confirmed() -> void: - $content.show() - $btn_clear.show() - $btn_save.show() - $dlg_file.hide() + $content.show() + $btn_clear.show() + $btn_save.show() + $dlg_file.hide() diff --git a/scenes/кнопка-3.tscn b/scenes/кнопка-3.tscn new file mode 100644 index 0000000..df9e386 --- /dev/null +++ b/scenes/кнопка-3.tscn @@ -0,0 +1,13 @@ +[gd_scene load_steps=3 format=3 uid="uid://b37dpuas0emkc"] + +[ext_resource type="Texture2D" uid="uid://bgekehgbqyddu" path="res://кнопка-3-1.png" id="1"] +[ext_resource type="Texture2D" uid="uid://caj3qxh8fo025" path="res://кнопка-3-0.png" id="2"] + +[node name="TextureButton" type="TextureButton"] +modulate = Color(1.5, 1.5, 1.5, 1) +offset_right = 140.0 +offset_bottom = 34.0 +toggle_mode = true +action_mode = 0 +texture_normal = ExtResource("2") +texture_pressed = ExtResource("1") diff --git a/scenes/кнопка-4.tscn b/scenes/кнопка-4.tscn new file mode 100644 index 0000000..d9f0dd7 --- /dev/null +++ b/scenes/кнопка-4.tscn @@ -0,0 +1,13 @@ +[gd_scene load_steps=3 format=3 uid="uid://bsafiravyb8yf"] + +[ext_resource type="Texture2D" uid="uid://c2tdcajjqjxa0" path="res://индикатор-1-1.png" id="1"] +[ext_resource type="Texture2D" uid="uid://c0hlip7h568qk" path="res://индикатор-1-0.png" id="2"] + +[node name="indicator_1" type="TextureButton"] +modulate = Color(1, 0.596078, 0.4, 1) +offset_right = 35.0 +offset_bottom = 29.0 +toggle_mode = true +button_mask = 0 +texture_normal = ExtResource("2") +texture_pressed = ExtResource("1") diff --git a/scenes/кнопка-эмс.gd b/scenes/кнопка-эмс.gd new file mode 100644 index 0000000..0b56efe --- /dev/null +++ b/scenes/кнопка-эмс.gd @@ -0,0 +1,51 @@ +@tool + +extends PanelContainer + + +@export var texture_state0: Texture2D = preload('res://data/кнопка-эмс-1.png'): + set(val): $state.set_texture(val) + + +@export var texture_state1: Texture2D = preload('res://data/кнопка-эмс-0.png'): + set(val): $state.set_texture(val) + + +@export var text: String = '': + set(val): $button.set_text(val) + get: return $button.get_text() + + +@export var pressed: bool = false: + set(val): $button.set_pressed(val) + get: return $button.is_pressed() + + +@export var toggle_mode: bool = false: + set(val): + if is_inside_tree(): + $button.set_toggle_mode(val) + get: return $button.is_toggle_mode() + + +func set_text (val: String): $button.set_text(val) +func set_pressed (val: bool): $button.set_pressed(val) + + +func set_toggle_mode (val: bool): + if is_inside_tree(): + $button.set_toggle_mode(val) + + +func get_text(): return $button.get_text() +func is_pressed(): return $button.is_pressed() +func is_toggle_mode(): return $button.is_toggle_mode() + + +func _on_button_toggled(val: bool): + if val: $state.set_texture(texture_state1) + else: $state.set_texture(texture_state0) + + +func button_connect(button_signal: String, proc: Callable): + $button.connect(button_signal, proc) diff --git a/scenes/кнопка-эмс.tscn b/scenes/кнопка-эмс.tscn new file mode 100644 index 0000000..df20123 --- /dev/null +++ b/scenes/кнопка-эмс.tscn @@ -0,0 +1,50 @@ +[gd_scene load_steps=9 format=3 uid="uid://gh3wqymu7cub"] + +[ext_resource type="Script" path="res://scenes/кнопка-эмс.gd" id="1_pmsh3"] +[ext_resource type="Texture2D" uid="uid://nfpish471rjj" path="res://data/кнопка-эмс-1.png" id="2_0o537"] + +[sub_resource type="StyleBoxEmpty" id="1"] + +[sub_resource type="StyleBoxEmpty" id="6"] + +[sub_resource type="StyleBoxEmpty" id="2"] + +[sub_resource type="StyleBoxEmpty" id="3"] + +[sub_resource type="StyleBoxEmpty" id="5"] + +[sub_resource type="StyleBoxEmpty" id="4"] + +[node name="container" type="PanelContainer"] +offset_right = 30.0 +offset_bottom = 30.0 +theme_override_styles/panel = SubResource("1") +script = ExtResource("1_pmsh3") +toggle_mode = true + +[node name="state" type="NinePatchRect" parent="."] +show_behind_parent = true +layout_mode = 2 +texture = ExtResource("2_0o537") +region_rect = Rect2(-1.60803, -1.9046, 32.1611, 25.9451) +patch_margin_left = 4 +patch_margin_top = 2 +patch_margin_right = 5 +patch_margin_bottom = 2 +axis_stretch_horizontal = 2 +axis_stretch_vertical = 2 + +[node name="button" type="Button" parent="."] +layout_mode = 2 +theme_override_styles/normal = SubResource("6") +theme_override_styles/hover = SubResource("2") +theme_override_styles/pressed = SubResource("3") +theme_override_styles/disabled = SubResource("5") +theme_override_styles/focus = SubResource("4") +toggle_mode = true +clip_text = true + +[node name="label" type="Label" parent="."] +layout_mode = 2 + +[connection signal="toggled" from="button" to="." method="_on_button_toggled"] diff --git a/scenes/контроль.gd b/scenes/контроль.gd index 776bcb1..a2aee48 100644 --- a/scenes/контроль.gd +++ b/scenes/контроль.gd @@ -2,41 +2,41 @@ extends Panel const PRIBORS_RES = \ [['pribor_uf', 'res://scenes/pribor_uf.tscn'], - ['pribor_rtr', 'res://scenes/pribor_rtr.tscn'], - ['pribor_afsp_l', 'res://scenes/pribor_afsp_l.tscn'], - ['pribor_afsp_r', 'res://scenes/pribor_afsp_r.tscn'], - ['pribor_sch3', 'res://scenes/pribor_sch3.tscn'], - ['pribor_spt_l', 'res://scenes/pribor_spt_l.tscn'], - ['pribor_spt_r', 'res://scenes/pribor_spt_r.tscn'], - ['pribor_prd_v_1', 'res://scenes/pribor_prd_v_1.tscn'], - ['pribor_prd_n_1', 'res://scenes/pribor_prd_n_1.tscn'], - ['pribor_prd_k_1', 'res://scenes/pribor_prd_k_1.tscn'], - ['pribor_prd_v_2', 'res://scenes/pribor_prd_v_2.tscn'], - ['pribor_prd_n_2', 'res://scenes/pribor_prd_n_2.tscn'], - ['pribor_prd_k_2', 'res://scenes/pribor_prd_k_2.tscn'], - ['pribor_prd_v_3', 'res://scenes/pribor_prd_v_3.tscn'], - ['pribor_prd_n_3', 'res://scenes/pribor_prd_n_3.tscn'], - ['pribor_prd_k_3', 'res://scenes/pribor_prd_k_3.tscn'], - ['pribor_prd_v_4', 'res://scenes/pribor_prd_v_4.tscn'], - ['pribor_prd_n_4', 'res://scenes/pribor_prd_n_4.tscn'], - ['pribor_prd_k_4', 'res://scenes/pribor_prd_k_4.tscn']] + ['pribor_rtr', 'res://scenes/pribor_rtr.tscn'], + ['pribor_afsp_l', 'res://scenes/pribor_afsp_l.tscn'], + ['pribor_afsp_r', 'res://scenes/pribor_afsp_r.tscn'], + ['pribor_sch3', 'res://scenes/pribor_sch3.tscn'], + ['pribor_spt_l', 'res://scenes/pribor_spt_l.tscn'], + ['pribor_spt_r', 'res://scenes/pribor_spt_r.tscn'], + ['pribor_prd_v_1', 'res://scenes/pribor_prd_v_1.tscn'], + ['pribor_prd_n_1', 'res://scenes/pribor_prd_n_1.tscn'], + ['pribor_prd_k_1', 'res://scenes/pribor_prd_k_1.tscn'], + ['pribor_prd_v_2', 'res://scenes/pribor_prd_v_2.tscn'], + ['pribor_prd_n_2', 'res://scenes/pribor_prd_n_2.tscn'], + ['pribor_prd_k_2', 'res://scenes/pribor_prd_k_2.tscn'], + ['pribor_prd_v_3', 'res://scenes/pribor_prd_v_3.tscn'], + ['pribor_prd_n_3', 'res://scenes/pribor_prd_n_3.tscn'], + ['pribor_prd_k_3', 'res://scenes/pribor_prd_k_3.tscn'], + ['pribor_prd_v_4', 'res://scenes/pribor_prd_v_4.tscn'], + ['pribor_prd_n_4', 'res://scenes/pribor_prd_n_4.tscn'], + ['pribor_prd_k_4', 'res://scenes/pribor_prd_k_4.tscn']] func _ready(): - for item in PRIBORS_RES: - var pribor_node = get_node(item[0]) - var pribor_sch_path = item[1] - pribor_node.connect('button_up', Callable(self, 'on_pribor_press').bind(pribor_sch_path)) + for item in PRIBORS_RES: + var pribor_node = get_node(item[0]) + var pribor_sch_path = item[1] + pribor_node.connect('button_up', Callable(self, 'on_pribor_press').bind(pribor_sch_path)) func on_pribor_press(pribor_sch_path): - clear_obj($pribor_sch) - var pribor_sch = load(pribor_sch_path).instantiate() - $pribor_sch.add_child(pribor_sch) + clear_obj($pribor_sch) + var pribor_sch = load(pribor_sch_path).instantiate() + $pribor_sch.add_child(pribor_sch) func clear_obj(obj: Object): - var items = obj.get_children() - for item in items: - obj.remove_child(item) - item.free() + var items = obj.get_children() + for item in items: + obj.remove_child(item) + item.free() diff --git a/scenes/переключатель-эмс.tscn b/scenes/переключатель-эмс.tscn new file mode 100644 index 0000000..c2a6b61 --- /dev/null +++ b/scenes/переключатель-эмс.tscn @@ -0,0 +1,24 @@ +[gd_scene load_steps=6 format=2] + +[sub_resource type="StyleBoxEmpty" id=1] + +[sub_resource type="StyleBoxEmpty" id=2] + +[sub_resource type="StyleBoxEmpty" id=3] + +[sub_resource type="StyleBoxEmpty" id=4] + +[sub_resource type="StyleBoxEmpty" id=5] + +[node name="Node2D" type="OptionButton"] +self_modulate = Color( 1, 0.596078, 0.4, 1 ) +offset_right = 70.0 +offset_bottom = 23.0 +custom_minimum_size = Vector2( 60, 0 ) +size_flags_horizontal = 15 +size_flags_vertical = 15 +theme_override_styles/hover = SubResource( 1 ) +theme_override_styles/pressed = SubResource( 2 ) +theme_override_styles/focus = SubResource( 3 ) +theme_override_styles/disabled = SubResource( 4 ) +theme_override_styles/normal = SubResource( 5 ) diff --git a/scenes/работа.gd b/scenes/работа.gd index 844ab94..74ea742 100644 --- a/scenes/работа.gd +++ b/scenes/работа.gd @@ -55,110 +55,110 @@ signal full_screen func _ready(): - $btn_strobe.button_connect('pressed', Callable(self, 'on_button_strobe_pressed')) - $btn_off.set_pressed(true) - strob_center = $canvas.get_strob_center() - on_button_strobe_pressed() - drag_fsm = DRAG_FSM.OFF - var nodes: = get_tree().get_nodes_in_group('группа-режим-помехи') - for btn in nodes: - btn.button_connect('pressed', Callable(self, 'on_button_pressed').bind(btn, nodes)) + $btn_strobe.button_connect('pressed', Callable(self, 'on_button_strobe_pressed')) + $btn_off.set_pressed(true) + strob_center = $canvas.get_strob_center() + on_button_strobe_pressed() + drag_fsm = DRAG_FSM.OFF + var nodes: = get_tree().get_nodes_in_group('группа-режим-помехи') + for btn in nodes: + btn.button_connect('pressed', Callable(self, 'on_button_pressed').bind(btn, nodes)) func on_button_strobe_pressed(): - if $btn_strobe.is_pressed(): - $canvas.set_strob_visible(true) - drag_fsm = DRAG_FSM.IDLE - else: - $canvas.set_strob_visible(false) - drag_fsm = DRAG_FSM.OFF + if $btn_strobe.is_pressed(): + $canvas.set_strob_visible(true) + drag_fsm = DRAG_FSM.IDLE + else: + $canvas.set_strob_visible(false) + drag_fsm = DRAG_FSM.OFF func on_button_pressed(btn_this, btn_others): - # поведение радиокнопок в группе - for btn_other in btn_others: - btn_other.set_pressed(btn_this == btn_other) + # поведение радиокнопок в группе + for btn_other in btn_others: + btn_other.set_pressed(btn_this == btn_other) func clip_value(val, val_min, val_max): - if val < val_min: val = val_min - if val > val_max: val = val_max - return val + if val < val_min: val = val_min + if val > val_max: val = val_max + return val func get_strob_width(pos: Vector2, prev: float) -> float: - var strob_dir_width: float = prev + (drag_pos_begin.y - pos.y) * drag_scale_width - strob_dir_width = clip_value(strob_dir_width, strob_min_width, strob_max_width) - return strob_dir_width + var strob_dir_width: float = prev + (drag_pos_begin.y - pos.y) * drag_scale_width + strob_dir_width = clip_value(strob_dir_width, strob_min_width, strob_max_width) + return strob_dir_width func get_strob_band(pos: Vector2, prev: float) -> float: - var strob_dir_band: float = prev - (drag_pos_begin.y - pos.y) * drag_scale_band - strob_dir_band = clip_value(strob_dir_band, strob_min_band, strob_max_band) - return strob_dir_band + var strob_dir_band: float = prev - (drag_pos_begin.y - pos.y) * drag_scale_band + strob_dir_band = clip_value(strob_dir_band, strob_min_band, strob_max_band) + return strob_dir_band func set_strob(pos: Vector2): - var radp: Vector2 = Tools.map_dec_to_rad(strob_center, pos) - if radp.y < $canvas.get_radius_max(): - $canvas.set_strob_dir(radp.x) - $canvas.set_strob_radius(radp.y) + var radp: Vector2 = Tools.map_dec_to_rad(strob_center, pos) + if radp.y < $canvas.get_radius_max(): + $canvas.set_strob_dir(radp.x) + $canvas.set_strob_radius(radp.y) func _on_drag_continue(event): - if drag_button == MOUSE_BUTTON_RIGHT: - if shift_pressed: - var strob_width: float = get_strob_width(event.position, strob_width_begin) - $canvas.set_strob_width(strob_width) - else: - var strob_band: float = get_strob_band(event.position, strob_band_begin) - $canvas.set_strob_band(strob_band) - elif drag_button == MOUSE_BUTTON_LEFT: - set_strob(event.position) + if drag_button == MOUSE_BUTTON_RIGHT: + if shift_pressed: + var strob_width: float = get_strob_width(event.position, strob_width_begin) + $canvas.set_strob_width(strob_width) + else: + var strob_band: float = get_strob_band(event.position, strob_band_begin) + $canvas.set_strob_band(strob_band) + elif drag_button == MOUSE_BUTTON_LEFT: + set_strob(event.position) func _on_drag_begin(event): - drag_pos_begin = event.position - if drag_button == MOUSE_BUTTON_LEFT: - set_strob(event.position) - elif drag_button == MOUSE_BUTTON_RIGHT: - strob_width_begin = $canvas.get_strob_width() - strob_band_begin = $canvas.get_strob_band() + drag_pos_begin = event.position + if drag_button == MOUSE_BUTTON_LEFT: + set_strob(event.position) + elif drag_button == MOUSE_BUTTON_RIGHT: + strob_width_begin = $canvas.get_strob_width() + strob_band_begin = $canvas.get_strob_band() func _input(event): - if event is InputEventMouseMotion: - if drag_fsm == DRAG_FSM.DRAG: - emit_signal('drag_continue', event) - elif event is InputEventMouseButton: - drag_button = event.button_index - if event.pressed: - if drag_fsm == DRAG_FSM.IDLE: - drag_fsm = DRAG_FSM.DRAG - emit_signal('drag_begin', event) - else: - drag_fsm = DRAG_FSM.IDLE - emit_signal('drag_end', event) - elif event is InputEventKey: - if event.pressed and event.physical_keycode == KEY_F11: - emit_signal('full_screen') - elif event.physical_keycode == KEY_SHIFT: - shift_pressed = event.pressed + if event is InputEventMouseMotion: + if drag_fsm == DRAG_FSM.DRAG: + emit_signal('drag_continue', event) + elif event is InputEventMouseButton: + drag_button = event.button_index + if event.pressed: + if drag_fsm == DRAG_FSM.IDLE: + drag_fsm = DRAG_FSM.DRAG + emit_signal('drag_begin', event) + else: + drag_fsm = DRAG_FSM.IDLE + emit_signal('drag_end', event) + elif event is InputEventKey: + if event.pressed and event.physical_keycode == KEY_F11: + emit_signal('full_screen') + elif event.physical_keycode == KEY_SHIFT: + shift_pressed = event.pressed func toggle_full_screen(id: int): - var mode = DisplayServer.window_get_mode(id) - if mode == DisplayServer.WINDOW_MODE_FULLSCREEN: - mode = DisplayServer.WINDOW_MODE_WINDOWED - else: - mode = DisplayServer.WINDOW_MODE_FULLSCREEN - DisplayServer.window_set_mode(mode, id) + var mode = DisplayServer.window_get_mode(id) + if mode == DisplayServer.WINDOW_MODE_FULLSCREEN: + mode = DisplayServer.WINDOW_MODE_WINDOWED + else: + mode = DisplayServer.WINDOW_MODE_FULLSCREEN + DisplayServer.window_set_mode(mode, id) func _on_full_screen(): - toggle_full_screen(window_1_id) - toggle_full_screen(window_0_id) + toggle_full_screen(window_1_id) + toggle_full_screen(window_0_id) func _on_btn_down(signal_name: String) -> void: - emit_signal(signal_name) + emit_signal(signal_name) diff --git a/scenes/рамка.gd b/scenes/рамка.gd index 0bb06c2..1801b46 100644 --- a/scenes/рамка.gd +++ b/scenes/рамка.gd @@ -4,15 +4,15 @@ extends NinePatchRect @export var horizontal_alignment: HorizontalAlignment = HorizontalAlignment.HORIZONTAL_ALIGNMENT_CENTER: - get: return $header.horizontal_alignment - set(val): $header.horizontal_alignment = val + get: return $header.horizontal_alignment + set(val): $header.horizontal_alignment = val @export var vertical_alignment: VerticalAlignment = VerticalAlignment.VERTICAL_ALIGNMENT_CENTER: - get: return $header.vertical_alignment - set(val): $header.vertical_alignment = val + get: return $header.vertical_alignment + set(val): $header.vertical_alignment = val @export var text: String = 'caption text': - get: return $header.text - set(val): $header.text = val + get: return $header.text + set(val): $header.text = val diff --git a/scenes/состояния-эмс.gd b/scenes/состояния-эмс.gd new file mode 100644 index 0000000..dae63dc --- /dev/null +++ b/scenes/состояния-эмс.gd @@ -0,0 +1,5 @@ +extends Control +var align : get = get_align, set = set_align +var _align: int = 0 +func set_align(align: int): _align = align +func get_align(): return _align diff --git a/scenes/состояния-эмс.tscn b/scenes/состояния-эмс.tscn new file mode 100644 index 0000000..e9def59 --- /dev/null +++ b/scenes/состояния-эмс.tscn @@ -0,0 +1,40 @@ +[gd_scene load_steps=7 format=3 uid="uid://by22sta8tt8dn"] + +[ext_resource type="Texture2D" uid="uid://belwchvdktrw0" path="res://data/эмс-бланк.png" id="1_0wisd"] +[ext_resource type="Script" path="res://scenes/состояния-эмс.gd" id="1_vw38j"] +[ext_resource type="Texture2D" uid="uid://bwddxs24es81u" path="res://data/эмс-бланк-пост.png" id="2_nbah5"] +[ext_resource type="Texture2D" uid="uid://pfoscstbm025" path="res://data/эмс-бланк-перем.png" id="3_vsgfs"] +[ext_resource type="Texture2D" uid="uid://dvl3sq036gn75" path="res://data/эмс-бланк-замыкание.png" id="4_qu3c5"] + +[sub_resource type="SpriteFrames" id="SpriteFrames_ow7xh"] +animations = [{ +"frames": [{ +"duration": 1.0, +"texture": ExtResource("1_0wisd") +}, { +"duration": 1.0, +"texture": ExtResource("2_nbah5") +}, { +"duration": 1.0, +"texture": ExtResource("3_vsgfs") +}, { +"duration": 1.0, +"texture": ExtResource("4_qu3c5") +}], +"loop": true, +"name": &"default", +"speed": 5.0 +}] + +[node name="Control" type="Control"] +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +script = ExtResource("1_vw38j") + +[node name="sprite" type="AnimatedSprite2D" parent="."] +position = Vector2(14, 9) +sprite_frames = SubResource("SpriteFrames_ow7xh") diff --git a/scenes/ячейка-1.tscn b/scenes/ячейка-1.tscn new file mode 100644 index 0000000..a396324 --- /dev/null +++ b/scenes/ячейка-1.tscn @@ -0,0 +1,7 @@ +[gd_scene format=3 uid="uid://dqcfr20vovhq5"] + +[node name="Label" type="Label"] +offset_right = 122.0 +offset_bottom = 34.0 +theme_override_colors/font_color = Color(1, 0.596078, 0.4, 1) +clip_text = true diff --git a/scenes/ячейка-2.tscn b/scenes/ячейка-2.tscn new file mode 100644 index 0000000..ff4ae36 --- /dev/null +++ b/scenes/ячейка-2.tscn @@ -0,0 +1,11 @@ +[gd_scene format=3 uid="uid://c65331tnwfcfa"] + +[node name="LineEdit" type="LineEdit"] +offset_right = 58.0 +offset_bottom = 33.0 +theme_override_colors/font_color = Color(1, 0.596078, 0.4, 1) +context_menu_enabled = false +shortcut_keys_enabled = false +middle_mouse_paste_enabled = false +caret_blink = true +caret_blink_interval = 0.13 diff --git a/scripts/threats.gd b/scripts/threats.gd index 355c5d8..209db54 100644 --- a/scripts/threats.gd +++ b/scripts/threats.gd @@ -3,27 +3,27 @@ extends Node class Threat: - enum FFlags { # Допустимые значения для Threat.fflags - NONE = 0, TMOD = 1, BAUD = 2, PROTO = 4, - SLON = 8, SLAT = 16, SALT = 32, LAT = 64, - LON = 128, ALT = 256 } + enum FFlags { # Допустимые значения для Threat.fflags + NONE = 0, TMOD = 1, BAUD = 2, PROTO = 4, + SLON = 8, SLAT = 16, SALT = 32, LAT = 64, + LON = 128, ALT = 256 } - var id: int # Идентификатор цели - var aoa: float # Курсовой угол на источник сигнала, градусы. - var freq: float # Частота несущей или центральная частота, МГц - var width: float # Ширина занимаемого диапазона частот, МГц - var pow_rx: float # Уровень принимаемого сигнала, дБм - var tick: int # Уровень принимаемого сигнала, дБм - var freqm: String # Режим смены частоты - var rkrp: String # Рекомендуемый режим помехи - var rparams: String # Рекомендуемые параметры помехи - var tmod: String # Тип модуляции - var baud: float # Модуляционная скорость - var proto: String # Тип протокола источника сигнала - var slon: float # Координаты старта, долгота в градусах. Достоверность задана значением Threat.fflags - var slat: float # Координаты старта, широта в градусах. Достоверность задана значением Threat.fflags - var salt: float # Координаты старта, высота от уровня моря. метры. Достоверность задана значением Threat.fflags - var lat: float # Текущие координаты, долгота в градусах. Достоверность задана значением Threat.fflags - var lon: float # Текущие координаты, широта в градусах. Достоверность задана значением Threat.fflags - var alt: float # Текущая высота, метры. Достоверность задана значением Threat.fflags - var fflags: FFlags # Флаги достоверности полей + var id: int # Идентификатор цели + var aoa: float # Курсовой угол на источник сигнала, градусы. + var freq: float # Частота несущей или центральная частота, МГц + var width: float # Ширина занимаемого диапазона частот, МГц + var pow_rx: float # Уровень принимаемого сигнала, дБм + var tick: int # Уровень принимаемого сигнала, дБм + var freqm: String # Режим смены частоты + var rkrp: String # Рекомендуемый режим помехи + var rparams: String # Рекомендуемые параметры помехи + var tmod: String # Тип модуляции + var baud: float # Модуляционная скорость + var proto: String # Тип протокола источника сигнала + var slon: float # Координаты старта, долгота в градусах. Достоверность задана значением Threat.fflags + var slat: float # Координаты старта, широта в градусах. Достоверность задана значением Threat.fflags + var salt: float # Координаты старта, высота от уровня моря. метры. Достоверность задана значением Threat.fflags + var lat: float # Текущие координаты, долгота в градусах. Достоверность задана значением Threat.fflags + var lon: float # Текущие координаты, широта в градусах. Достоверность задана значением Threat.fflags + var alt: float # Текущая высота, метры. Достоверность задана значением Threat.fflags + var fflags: FFlags # Флаги достоверности полей diff --git a/scripts/tools.gd b/scripts/tools.gd index bf9720a..0f7019e 100644 --- a/scripts/tools.gd +++ b/scripts/tools.gd @@ -2,59 +2,59 @@ extends Node func map_dec_to_rad(pos0: Vector2, pos: Vector2) -> Vector2: - """ Преобразует декартовые координаты в полярные """ - var x1: float = pos.x - pos0.x - var y1: float = pos.y - pos0.y - var ang: float = (atan2(y1, x1) * 180.0) / PI - ang += 360.0 * float(ang < 0.0) - var radius: float = hypot(x1, y1) - return Vector2(ang, radius) + """ Преобразует декартовые координаты в полярные """ + var x1: float = pos.x - pos0.x + var y1: float = pos.y - pos0.y + var ang: float = (atan2(y1, x1) * 180.0) / PI + ang += 360.0 * float(ang < 0.0) + var radius: float = hypot(x1, y1) + return Vector2(ang, radius) func hypot(x: float, y: float) -> float: - return sqrt(x * x + y * y) + return sqrt(x * x + y * y) func is_overlap(x1, x2, y1, y2): - """ Проверяет пересечение диапазона x1, x2 с диапазоном y1, y2 """ - return max(x1, y1) <= min(x2, y2) + """ Проверяет пересечение диапазона x1, x2 с диапазоном y1, y2 """ + return max(x1, y1) <= min(x2, y2) func ibytes_to_word(buf: PackedByteArray, i: int) -> int: - return buf[i] + (buf[i + 1] * 256) + return buf[i] + (buf[i + 1] * 256) func map_range(val: float, a0: float, a1: float, b0: float, b1: float) -> float: - """ Переводит значение val из диапазона a0...a1 в диапазон b0...b1 """ - return (((val - a0) * (b1 - b0)) / (a1 - a0)) + b0 + """ Переводит значение val из диапазона a0...a1 в диапазон b0...b1 """ + return (((val - a0) * (b1 - b0)) / (a1 - a0)) + b0 func type_is_num(val) -> bool: - """ Возвращает true, если val число, false - если иначе """ - return (typeof(val) == TYPE_INT) or (typeof(val) == typeof(0.0)) + """ Возвращает true, если val число, false - если иначе """ + return (typeof(val) == TYPE_INT) or (typeof(val) == typeof(0.0)) func sort_ascending_0(a, b) -> bool: - return a[0] < b[0] + return a[0] < b[0] func is_point_in_polygon(pos: Vector2, p: PackedVector2Array) -> bool: - var j: int = len(p) - 1 - var odd_nodes: int = 0 - for i in range(len(p)): - if ((p[i].y < pos.y and p[j].y >= pos.y or p[j].y < pos.y and p[i].y >= pos.y) and (p[i].x <= pos.x or p[j].x <= pos.x)): - odd_nodes ^= int((p[i].x + (pos.y - p[i].y) / (p[j].y - p[i].y) * (p[j].x - p[i].x) < pos.x)) - j = i - return odd_nodes > 0 + var j: int = len(p) - 1 + var odd_nodes: int = 0 + for i in range(len(p)): + if ((p[i].y < pos.y and p[j].y >= pos.y or p[j].y < pos.y and p[i].y >= pos.y) and (p[i].x <= pos.x or p[j].x <= pos.x)): + odd_nodes ^= int((p[i].x + (pos.y - p[i].y) / (p[j].y - p[i].y) * (p[j].x - p[i].x) < pos.x)) + j = i + return odd_nodes > 0 func set_wordi(buf: Array, index, val): - """ - Устанавливает слово в байтовом массиве - :param buf: Байтовый массив - :param index: Индекс младшего байта слова в массиве - :param val: Значение слова для записи в батовый массив - :return: None """ - buf[index] = val & 0xff - buf[index + 1] = (val >> 8) & 0xff + """ + Устанавливает слово в байтовом массиве + :param buf: Байтовый массив + :param index: Индекс младшего байта слова в массиве + :param val: Значение слова для записи в батовый массив + :return: None """ + buf[index] = val & 0xff + buf[index + 1] = (val >> 8) & 0xff diff --git a/scripts/yems_devs.gd b/scripts/yems_devs.gd new file mode 100644 index 0000000..840ff47 --- /dev/null +++ b/scripts/yems_devs.gd @@ -0,0 +1,43 @@ +extends Node + + +class InDev: + var id: int # Идентификатор индекс устройства + var dev_name: String # Имя подключаемого комплекса + var connector: String # Номер разъёма в приборе + var delay: float # Задержка фронта импульса + var offset: float # Смещение фронта импульса + var state: int # Состояние входа + var freq: int # Предполагаемая частота на которой работает комплекс + var ports_data: Dictionary # Словарь состояния портов устройства + var tbl_row_id: int # Индекс устройства в таблице входов + var out_dots: Array # Список выходных устройств в порядке, как в таблице и точки матрицы + + func _init(dev_id : int, params : Array, row_id : int): + id = dev_id + dev_name = String(params[0]) + connector = String(params[1]) + delay = float(params[2]) + offset = float(params[3]) + tbl_row_id = row_id + + +class OutDev: + var id: int # Идентификатор индекс устройства + var dev_name: String # Имя подключаемого комплекса + var connector: String # Номер разъёма в приборе + var delay: float # Задержка фронта импульса + var offset: float # Смещение фронта импульса + var state: int # Состояние входа + var freq: int # Предполагаемая частота на которой работает комплекс + var ports_data: Dictionary # Словарь состояния портов устройства + var tbl_row_id: int # Индекс устройства в таблице выходов + var mode: int # Режим работы выхода + + func _init(dev_id : int, params : Array, row_id : int): + id = dev_id + dev_name = String(params[0]) + connector = String(params[1]) + delay = float(params[2]) + offset = float(params[3]) + tbl_row_id = row_id diff --git a/table/table.gd b/table/table.gd index ec13200..9eccd06 100644 --- a/table/table.gd +++ b/table/table.gd @@ -34,506 +34,505 @@ signal selected_changed(i_row: int) # Вызывается при измене func selector_up(): - var i_rows: = [] - get_selected_rows(i_rows) - for i in i_rows: - set_row_selected(i, false) - var rows_count: = get_rows_count() - if not (i_rows.size() and (rows_count > 1)): - return - var i_row = i_rows[0] - i_row -= 1 - if i_row < 0: - i_row = rows_count - 1 - set_row_selected(i_row, true) - emit_signal('selected_changed', i_row) + var i_rows: = [] + get_selected_rows(i_rows) + for i in i_rows: + set_row_selected(i, false) + var rows_count: = get_rows_count() + if not (i_rows.size() and (rows_count > 1)): + return + var i_row = i_rows[0] + i_row -= 1 + if i_row < 0: + i_row = rows_count - 1 + set_row_selected(i_row, true) + emit_signal('selected_changed', i_row) func selector_down(): - var i_rows: = [] - get_selected_rows(i_rows) - for i in i_rows: - set_row_selected(i, false) - var rows_count: = get_rows_count() - if not (i_rows.size() and (rows_count > 1)): - return - var i_row = i_rows[0] - i_row += 1 - i_row %= rows_count - set_row_selected(i_row, true) - emit_signal('selected_changed', i_row) + var i_rows: = [] + get_selected_rows(i_rows) + for i in i_rows: + set_row_selected(i, false) + var rows_count: = get_rows_count() + if not (i_rows.size() and (rows_count > 1)): + return + var i_row = i_rows[0] + i_row += 1 + i_row %= rows_count + set_row_selected(i_row, true) + emit_signal('selected_changed', i_row) func set_columns_alignments(alignments): - assert(columns == alignments.size()) - var rows_count: = get_rows_count() - for i_row in rows_count: - for i_col in alignments.size(): - set_node_alligment(i_col, i_row, alignments[i_col]) + assert(columns == alignments.size()) + var rows_count: = get_rows_count() + for i_row in rows_count: + for i_col in alignments.size(): + set_node_alligment(i_col, i_row, alignments[i_col]) func load_selector_scene(file_name: String): - selector_type_file = file_name - ScnSelector = load(file_name) + selector_type_file = file_name + ScnSelector = load(file_name) func load_node_scene(file_name: String): - node_type_file = file_name - ScnNode = load(file_name) + node_type_file = file_name + ScnNode = load(file_name) func get_node_scene(): - return node_type_file + return node_type_file func _ready(): - ScnSelector = load(selector_type_file) - ScnNode = load(node_type_file) - assert(ScnSelector) - assert(ScnNode) + ScnSelector = load(selector_type_file) + ScnNode = load(node_type_file) + assert(ScnSelector) + assert(ScnNode) func align_to_left_bottom(header, gap: = Vector2(0, 0)): - """ Выравнивает по нижнему левому углу. - Используется для выравнивания по заголовку """ - position.x = header.position.x + gap.x - position.y = header.position.y + header.size.y + gap.y + """ Выравнивает по нижнему левому углу. + Используется для выравнивания по заголовку """ + position.x = header.position.x + gap.x + position.y = header.position.y + header.size.y + gap.y func _assert_meta(i_col: int, i_row: int, pname: String, node): - assert(node.has_meta(pname), 'ошибка: нет мета-свойства \"%s\" у ячейки (%s): колонка:%d ряд:%d' % [pname, typeof(node), i_col, i_row]) + assert(node.has_meta(pname), 'ошибка: нет мета-свойства \"%s\" у ячейки (%s): колонка:%d ряд:%d' % [pname, typeof(node), i_col, i_row]) func set_node_meta(i_col: int, i_row: int, pname: String, val) -> void: - var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row) - var node = nodes[key] - node.set_meta(pname, val) + var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row) + var node = nodes[key] + node.set_meta(pname, val) func get_node_meta(i_col: int, i_row: int, pname: String): - var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row) - var node = nodes[key] - _assert_meta(i_col, i_row, pname, node) - return node.get_meta(pname) + var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row) + var node = nodes[key] + _assert_meta(i_col, i_row, pname, node) + return node.get_meta(pname) func set_node_property(i_col: int, i_row: int, pname: String, val) -> void: - var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row) - var node = nodes[key] - node.set(pname, val) + var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row) + var node = nodes[key] + node.set(pname, val) func get_node_property(i_col: int, i_row: int, pname: String): - var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row) - var node = nodes[key] - return node.get(pname) + var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row) + var node = nodes[key] + return node.get(pname) func get_node_key(format: String, i_col: int, i_row: int) -> String: - var key: String = format % [i_row, i_col] - assert(nodes.has(key), 'ошибка: нет такой ячейки: колонка:%d ряд:%d' % [i_col, i_row]) - return key + var key: String = format % [i_row, i_col] + assert(nodes.has(key), 'ошибка: нет такой ячейки: колонка:%d ряд:%d' % [i_col, i_row]) + return key func get_key_indexes(key: String) -> Array: - var tokens: = key.split('_') - assert(tokens.size() == 3, 'ошибка: неверный ключ: \"%s\"' % key) - return [int(tokens[2]), int(tokens[1])] + var tokens: = key.split('_') + assert(tokens.size() == 3, 'ошибка: неверный ключ: \"%s\"' % key) + return [int(tokens[2]), int(tokens[1])] func set_columns_min_size(sizes: Array) -> void: - var rows_count: = get_rows_count() - for i_row in rows_count: - set_nodes_min_size(i_row, sizes) - set_nodes_min_size(0, sizes, HEAD_KEY_FORMAT) + var rows_count: = get_rows_count() + for i_row in rows_count: + set_nodes_min_size(i_row, sizes) + set_nodes_min_size(0, sizes, HEAD_KEY_FORMAT) func set_columns_aligment(alignments: Array) -> void: - var rows_count: = get_rows_count() - for i_row in rows_count: - for i_col in alignments.size(): - set_node_alligment(i_col, i_row, alignments[i_col]) + var rows_count: = get_rows_count() + for i_row in rows_count: + for i_col in alignments.size(): + set_node_alligment(i_col, i_row, alignments[i_col]) func _input(event) -> void: - if event is InputEventKey: - if in_focus and event.pressed: - if event.keycode == selector_key_up: - selector_up() - elif event.keycode == selector_key_down: - selector_down() - elif event is InputEventMouseButton: - if not event.pressed: - return - if (event.position.x < position.x) \ - or (event.position.x > (position.x + size.x)) \ - or (event.position.y < position.y) \ - or (event.position.y > (position.y + size.y)): - in_focus = false - emit_signal('focus_exited') - return - var rows_count: = get_rows_count() - in_focus = true - emit_signal('focus_entered') - for i_row in rows_count: - var rect = [0, 0, 0, 0] - get_node_rect(0, i_row, rect) - var y = rect[1] + position.y - if event.position.y < y: - continue - if event.position.y > (y + rect[3]): - continue - emit_signal('row_pressed', i_row) - break + if event is InputEventKey: + if in_focus and event.pressed: + if event.keycode == selector_key_up: + selector_up() + elif event.keycode == selector_key_down: + selector_down() + elif event is InputEventMouseButton: + if not event.pressed: + return + if (event.position.x < position.x) \ + or (event.position.x > (position.x + size.x)) \ + or (event.position.y < position.y) \ + or (event.position.y > (position.y + size.y)): + in_focus = false + emit_signal('focus_exited') + return + var rows_count: = get_rows_count() + in_focus = true + emit_signal('focus_entered') + for i_row in rows_count: + var rect = [0, 0, 0, 0] + get_node_rect(0, i_row, rect) + var y = rect[1] + position.y + if event.position.y < y: + continue + if event.position.y > (y + rect[3]): + continue + emit_signal('row_pressed', i_row) + break func _init() -> void: - selector_color_proc = Callable(self, 'defaultselector_color_proc') - assert(selector_color_proc.is_valid()) - selector_size_proc = Callable(self, 'default_selector_size_proc') - assert(selector_size_proc.is_valid()) + selector_color_proc = Callable(self, 'defaultselector_color_proc') + assert(selector_color_proc.is_valid()) + selector_size_proc = Callable(self, 'default_selector_size_proc') + assert(selector_size_proc.is_valid()) func defaultselector_color_proc(_i_row: int): - return selector_color + return selector_color func setselector_color_proc(instance: Object, function: String) -> void: - selector_color_proc = Callable(instance, function) - assert(selector_color_proc.is_valid()) + selector_color_proc = Callable(instance, function) + assert(selector_color_proc.is_valid()) func set_selector_size_proc(instance: Object, function: String) -> void: - selector_size_proc = Callable(instance, function) - assert(selector_size_proc.is_valid()) + selector_size_proc = Callable(instance, function) + assert(selector_size_proc.is_valid()) func default_selector_size_proc(i_row: int, rect: Array) -> void: - get_row_rect(i_row, rect) - rect[0] = rect[0] + position.x - node_gap.x / 2.0 - rect[1] = rect[1] + position.y - node_gap.y / 2.0 - rect[2] = rect[2] + node_gap.x - rect[3] = rect[3] + node_gap.y + get_row_rect(i_row, rect) + rect[0] = rect[0] + position.x - node_gap.x / 2.0 + rect[1] = rect[1] + position.y - node_gap.y / 2.0 + rect[2] = rect[2] + node_gap.x + rect[3] = rect[3] + node_gap.y func clear_rows_selected(): - var rows_count: = get_rows_count() - for i_row in rows_count: - set_row_selected(i_row, false) + var rows_count: = get_rows_count() + for i_row in rows_count: + set_row_selected(i_row, false) func set_row_selected(i_row: int, selected: bool = true) -> void: - var key: = ROW_SELECTOR_KEY_FORMAT % [i_row, 0] - var parent = get_parent() - if nodes.has(key) and (not selected): - var selector = nodes[key] - parent.remove_child(selector) - selector.queue_free() - nodes.erase(key) - elif (not nodes.has(key)) and selected: - var selector = ScnSelector.instantiate() - var rect: = [0, 0, 0, 0] - selector_size_proc.call(i_row, rect) - selector.position.x = rect[0] - selector.position.y = rect[1] - selector.size.x = rect[2] - selector.size.y = rect[3] - selector.modulate = selector_color_proc.call(i_row) - nodes[key] = selector - parent.add_child(selector) + var key: = ROW_SELECTOR_KEY_FORMAT % [i_row, 0] + var parent = get_parent() + if nodes.has(key) and (not selected): + var selector = nodes[key] + parent.remove_child(selector) + selector.queue_free() + nodes.erase(key) + elif (not nodes.has(key)) and selected: + var selector = ScnSelector.instantiate() + var rect: = [0, 0, 0, 0] + selector_size_proc.call(i_row, rect) + selector.position.x = rect[0] + selector.position.y = rect[1] + selector.size.x = rect[2] + selector.size.y = rect[3] + selector.modulate = selector_color_proc.call(i_row) + nodes[key] = selector + parent.add_child(selector) func is_row_selected(i_row: int) -> bool: - var key: = get_node_key(ROW_SELECTOR_KEY_FORMAT, 0, i_row) - return nodes.has(key) + var key: = get_node_key(ROW_SELECTOR_KEY_FORMAT, 0, i_row) + return nodes.has(key) func get_selected_rows(rows: Array) -> void: - for key in nodes.keys(): - if SLCT_PREFIX in key: - var indexes = get_key_indexes(key) - rows.append(indexes[1]) + for key in nodes.keys(): + if SLCT_PREFIX in key: + var indexes = get_key_indexes(key) + rows.append(indexes[1]) func get_rows_count() -> int: - var rows_count: int = 0 - for key in nodes: - rows_count += int(NODE_PREFIX in key) - return rows_count / columns + var rows_count: int = 0 + for key in nodes: + rows_count += int(NODE_PREFIX in key) + return rows_count / columns func get_node2(i_col: int, i_row: int) -> Node: - var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row) - return nodes[key] + var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row) + return nodes[key] func set_node_user_data(i_col: int, i_row: int, user_data: Object) -> void: - var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row) - nodes[key] = user_data + var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row) + nodes[key] = user_data func add_row(row_types: Array) -> void: - assert(row_types.size() < MAX_INDEX, 'ошибка: слишком много колонок, больше %d' % (MAX_INDEX + 1)) - if columns == 1: - set_columns(row_types.size()) - else: - assert(columns == row_types.size(), 'ошибка: %s количество колонок установлено ранее - %d, но требуется %d' % [self, columns, row_types.size()]) - var rows_count: int = get_rows_count() - assert(rows_count < MAX_INDEX, 'ошибка: слишком много рядов, больше %d' % (MAX_INDEX + 1)) - for i_col in columns: - var node = row_types[i_col].instantiate() - var key: String = NODE_KEY_FORMAT % [rows_count, i_col] - node.name = key - add_child(node) - nodes[key] = node + assert(row_types.size() < MAX_INDEX, 'ошибка: слишком много колонок, больше %d' % (MAX_INDEX + 1)) + if columns == 1: + set_columns(row_types.size()) + else: + assert(columns == row_types.size(), 'ошибка: %s количество колонок установлено ранее - %d, но требуется %d' % [self, columns, row_types.size()]) + var rows_count: int = get_rows_count() + assert(rows_count < MAX_INDEX, 'ошибка: слишком много рядов, больше %d' % (MAX_INDEX + 1)) + for i_col in columns: + var node = row_types[i_col].instantiate() + var key: String = NODE_KEY_FORMAT % [rows_count, i_col] + node.name = key + add_child(node) + nodes[key] = node func set_header(header_types: Array): - assert(header_types.size() < MAX_INDEX, 'ошибка: слишком много колонок, больше %d' % (MAX_INDEX + 1)) - if columns == 1: - set_columns(header_types.size()) - else: - assert(columns == header_types.size()) - var do_adj: = false - if not header: - header = GridContainer.new() - header.position = position - header.columns = header_types.size() - header.size.x = size.x - var parent = get_parent() - parent.add_child(header) - do_adj = true - else: - var childrens = header.get_children() - for node in childrens: - childrens.erase(node.name) - childrens.remove_child(node) - node.queue_free() - for i_col in columns: - var node = header_types[i_col].instantiate() - var key: String = HEAD_KEY_FORMAT % [0, i_col] - node.name = key - nodes[key] = node - header.add_child(node) - if do_adj: - var rect = [0, 0, 0, 0] - get_node_rect(0, 0, rect, HEAD_KEY_FORMAT) - position.y += rect[3] + assert(header_types.size() < MAX_INDEX, 'ошибка: слишком много колонок, больше %d' % (MAX_INDEX + 1)) + if columns == 1: + set_columns(header_types.size()) + else: + assert(columns == header_types.size()) + var do_adj: = false + if not header: + header = GridContainer.new() + header.position = position + header.columns = header_types.size() + header.size.x = size.x + var parent = get_parent() + parent.add_child(header) + do_adj = true + else: + var childrens = header.get_children() + for node in childrens: + childrens.erase(node.name) + childrens.remove_child(node) + node.queue_free() + for i_col in columns: + var node = header_types[i_col].instantiate() + var key: String = HEAD_KEY_FORMAT % [0, i_col] + node.name = key + nodes[key] = node + header.add_child(node) + if do_adj: + var rect = [0, 0, 0, 0] + get_node_rect(0, 0, rect, HEAD_KEY_FORMAT) + position.y += rect[3] func set_header_text(headers: Array): - assert(columns == headers.size()) - set_row_text(0, headers, 0, HEAD_KEY_FORMAT) + assert(columns == headers.size()) + set_row_text(0, headers, 0, HEAD_KEY_FORMAT) func get_node_user_data(i_col: int, i_row: int) -> Object: - var key: = get_node_key(DATA_KEY_FORMAT, i_col, i_row) - return nodes[key] + var key: = get_node_key(DATA_KEY_FORMAT, i_col, i_row) + return nodes[key] func remove_row(i_row: int): - var sel_key: String = ROW_SELECTOR_KEY_FORMAT % [i_row, 0] - if nodes.has(sel_key): - var selector = nodes[sel_key] - get_parent().remove_child(selector) - selector.queue_free() - nodes.erase(sel_key) - for i_col in columns: - var node_key: String = get_node_key(NODE_KEY_FORMAT, i_col, i_row) - var conn_key: String = CONNECTED_KEY_FORMAT % [i_row, i_col] - var data_key: String = DATA_KEY_FORMAT % [i_row, i_col] - var node = nodes[node_key] - nodes.erase(node_key) - remove_child(node) - node.queue_free() + var sel_key: String = ROW_SELECTOR_KEY_FORMAT % [i_row, 0] + if nodes.has(sel_key): + var selector = nodes[sel_key] + get_parent().remove_child(selector) + selector.queue_free() + nodes.erase(sel_key) + for i_col in columns: + var node_key: String = get_node_key(NODE_KEY_FORMAT, i_col, i_row) + var conn_key: String = CONNECTED_KEY_FORMAT % [i_row, i_col] + var data_key: String = DATA_KEY_FORMAT % [i_row, i_col] + var node = nodes[node_key] + nodes.erase(node_key) + remove_child(node) + node.queue_free() - if nodes.has(data_key): - nodes.erase(data_key) - if nodes.has(conn_key): - var conn = nodes[conn_key] - var callback = conn[0] - var dest_node = conn[1] - node.disconnect('pressed', Callable(dest_node, callback)) - nodes.erase(conn_key) + if nodes.has(data_key): + nodes.erase(data_key) + if nodes.has(conn_key): + var conn = nodes[conn_key] + var callback = conn[0] + var dest_node = conn[1] + node.disconnect('pressed', Callable(dest_node, callback)) + nodes.erase(conn_key) func rehash(swaps: Array): - """ Переназначает ключи в соответствии с размерами таблицы. - После вызова swaps содержит массив пар [<прежний ключ>, <текущий ключ>] """ - assert(not swaps.size(), 'ошибка: swaps не пустой') - var nodes_copy: = {} - var i_col: = 0 - var i_row: = 0 - for key0 in nodes: - if NODE_PREFIX in key0: - var node_key1: String = NODE_KEY_FORMAT % [i_row, i_col] - nodes_copy[node_key1] = nodes[key0] - swaps.append([key0, node_key1]) + """ Переназначает ключи в соответствии с размерами таблицы. + После вызова swaps содержит массив пар [<прежний ключ>, <текущий ключ>] """ + assert(not swaps.size(), 'ошибка: swaps не пустой') + var nodes_copy: = {} + var i_col: = 0 + var i_row: = 0 + for key0 in nodes: + if NODE_PREFIX in key0: + var node_key1: String = NODE_KEY_FORMAT % [i_row, i_col] + nodes_copy[node_key1] = nodes[key0] + swaps.append([key0, node_key1]) - var indxs = get_key_indexes(key0) + var indxs = get_key_indexes(key0) - var slct_key0: String = ROW_SELECTOR_KEY_FORMAT % [indxs[1], indxs[0]] - if nodes.has(slct_key0): - var slct_key1: String = ROW_SELECTOR_KEY_FORMAT % [i_row, i_col] - nodes_copy[slct_key1] = nodes[slct_key0] - swaps.append([slct_key0, slct_key1]) + var slct_key0: String = ROW_SELECTOR_KEY_FORMAT % [indxs[1], indxs[0]] + if nodes.has(slct_key0): + var slct_key1: String = ROW_SELECTOR_KEY_FORMAT % [i_row, i_col] + nodes_copy[slct_key1] = nodes[slct_key0] + swaps.append([slct_key0, slct_key1]) - var conn_key0: String = CONNECTED_KEY_FORMAT % [indxs[1], indxs[0]] - if nodes.has(conn_key0): - var conn_key1: String = CONNECTED_KEY_FORMAT % [i_row, i_col] - nodes_copy[conn_key1] = nodes[conn_key0] - swaps.append([conn_key0, conn_key1]) + var conn_key0: String = CONNECTED_KEY_FORMAT % [indxs[1], indxs[0]] + if nodes.has(conn_key0): + var conn_key1: String = CONNECTED_KEY_FORMAT % [i_row, i_col] + nodes_copy[conn_key1] = nodes[conn_key0] + swaps.append([conn_key0, conn_key1]) - var data_key0: String = DATA_KEY_FORMAT % [indxs[1], indxs[0]] - if nodes.has(data_key0): - var data_key1: String = DATA_KEY_FORMAT % [i_row, i_col] - nodes_copy[data_key1] = nodes[data_key0] - swaps.append([data_key0, data_key1]) + var data_key0: String = DATA_KEY_FORMAT % [indxs[1], indxs[0]] + if nodes.has(data_key0): + var data_key1: String = DATA_KEY_FORMAT % [i_row, i_col] + nodes_copy[data_key1] = nodes[data_key0] + swaps.append([data_key0, data_key1]) - i_col += 1 - if i_col == columns: - i_col = 0 - i_row += 1 - nodes.clear() - nodes.merge(nodes_copy) + i_col += 1 + if i_col == columns: + i_col = 0 + i_row += 1 + nodes.clear() + nodes.merge(nodes_copy) func clear_rows() -> void: - """ Удаляет все строки таблицы """ - var rows_count: int = get_rows_count() - for i_row in rows_count: - remove_row(i_row) + """ Удаляет все строки таблицы """ + var rows_count: int = get_rows_count() + for i_row in rows_count: + remove_row(i_row) func set_callbacks(dest_node: Node, event_name: String, callback: String, clmns: Array, user_data: Array) -> void: - """ Настраивает обратные вызовы для колонок. - :dest_node: Получатель события - :event_name: Имя события - :callback: Имя функции получателя события - :clmns: Индексы колонок - :user_data: Аргументы функции получателя события """ - var rows_count = get_rows_count() - for i_row in rows_count: - for i_col in clmns: - assert(i_col >= 0 and i_col < columns, 'ошибка: нет колонки %d' % i_col) - var node_key: String = NODE_KEY_FORMAT % [i_row, i_col] - var conn_key: String = CONNECTED_KEY_FORMAT % [i_row, i_col] - var node = nodes[node_key] - if nodes.has(conn_key): - var conn = nodes[conn_key] - var prev_callback = conn[0] - var prev_dest_node = conn[1] - node.disconnect(event_name, Callable(prev_dest_node, prev_callback)) - assert (OK == node.connect(event_name, Callable(dest_node, callback).bind([node] + user_data))) - nodes[conn_key] = [callback, dest_node] + """ Настраивает обратные вызовы для колонок. + :dest_node: Получатель события + :event_name: Имя события + :callback: Имя функции получателя события + :clmns: Индексы колонок + :user_data: Аргументы функции получателя события """ + var rows_count = get_rows_count() + for i_row in rows_count: + for i_col in clmns: + assert(i_col >= 0 and i_col < columns, 'ошибка: нет колонки %d' % i_col) + var node_key: String = NODE_KEY_FORMAT % [i_row, i_col] + var conn_key: String = CONNECTED_KEY_FORMAT % [i_row, i_col] + var node = nodes[node_key] + if nodes.has(conn_key): + var conn = nodes[conn_key] + var prev_callback = conn[0] + var prev_dest_node = conn[1] + node.disconnect(event_name, Callable(prev_dest_node, prev_callback)) + assert (OK == node.connect(event_name, Callable(dest_node, callback).bind([node] + user_data))) + nodes[conn_key] = [callback, dest_node] func set_rows_text(rows: Array) -> void: - for i_row in rows.size(): - for i_col in columns: - var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row) - var node = nodes[key] - node.text = rows[i_row][i_col] + for i_row in rows.size(): + for i_col in columns: + var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row) + var node = nodes[key] + node.text = rows[i_row][i_col] func set_nodes_min_size(i_row: int, sizes: Array, key_format: String = NODE_KEY_FORMAT) -> void: - for i_col in columns: - var key: = get_node_key(key_format, i_col, i_row) - var node = nodes[key] - node.custom_minimum_size.x = sizes[i_col] - node.size.x = sizes[i_col] + for i_col in columns: + var key: = get_node_key(key_format, i_col, i_row) + var node = nodes[key] + node.custom_minimum_size.x = sizes[i_col] + node.size.x = sizes[i_col] func set_node_text(i_col: int, i_row: int, val: String) -> void: - var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row) - nodes[key].text = val + var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row) + nodes[key].text = val func set_rows_state(rows: Array) -> void: - for i_row in rows.size(): - for i_col in columns: - var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row) - nodes[key].button_pressed = rows[i_row][i_col] + for i_row in rows.size(): + for i_col in columns: + var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row) + nodes[key].button_pressed = rows[i_row][i_col] func set_node_state(i_col: int, i_row: int, val: bool) -> void: - var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row) - nodes[key].button_pressed = val + var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row) + nodes[key].button_pressed = val func set_node_frame(i_col: int, i_row: int, node_name: String, val: int) -> void: - var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row) - var node = nodes[key] - var sprite = node.get_node(node_name) - sprite.frame = val + var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row) + var node = nodes[key] + var sprite = node.get_node(node_name) + sprite.frame = val func set_node_editable(i_col: int, i_row: int, val: bool) -> void: - var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row) - nodes[key].editable = val + var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row) + nodes[key].editable = val func set_node_alligment(i_col: int, i_row: int, val: int) -> void: - var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row) - if 'horizontal_alignment' in nodes[key]: - nodes[key].horizontal_alignment = val - elif 'alignment' in nodes[key]: - nodes[key].alignment = val + var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row) + if 'horizontal_alignment' in nodes[key]: + nodes[key].horizontal_alignment = val + elif 'alignment' in nodes[key]: + nodes[key].alignment = val func set_row_alligments(i_row: int, aligns: Array) -> void: - for i_col in columns: - var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row) - nodes[key].align = aligns[i_col] + for i_col in columns: + var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row) + nodes[key].align = aligns[i_col] func get_row_text(i_row: int) -> Array: - var row: = [] - for i_col in columns: - var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row) - row.append(nodes[key].text) - return row + var row: = [] + for i_col in columns: + var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row) + row.append(nodes[key].text) + return row func set_row_text(i_row: int, row: Array, i_begin: int = 0, key_format: String = NODE_KEY_FORMAT) -> void: - assert((i_begin + row.size()) < columns) - for i_col in columns - i_begin: - var key: = get_node_key(key_format, i_col + i_begin, i_row) - nodes[key].text = row[i_col] + for i_col in columns - i_begin: + var key: = get_node_key(key_format, i_col + i_begin, i_row) + nodes[key].text = row[i_col] func get_rows_text() -> Array: - var rows_count: = get_rows_count() - var rows: = [] - for i_row in rows_count: - var row = get_row_text(i_row) - rows.append(row) - return rows + var rows_count: = get_rows_count() + var rows: = [] + for i_row in rows_count: + var row = get_row_text(i_row) + rows.append(row) + return rows func get_row(i_row: int) -> Array: - var row: = [] - for i_col in columns: - var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row) - row.append(nodes[key]) - return row + var row: = [] + for i_col in columns: + var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row) + row.append(nodes[key]) + return row func get_node_rect(i_col: int, i_row: int, rect: Array, key_format: String = NODE_KEY_FORMAT) -> void: - assert(rect.size() >= 4, 'ошибка: мало элементов для возврата результата') - var key: = get_node_key(key_format, i_col, i_row) - var cell = nodes[key] - rect[0] = cell.position.x - rect[1] = cell.position.y - rect[2] = cell.size.x - rect[3] = cell.size.y + assert(rect.size() >= 4, 'ошибка: мало элементов для возврата результата') + var key: = get_node_key(key_format, i_col, i_row) + var cell = nodes[key] + rect[0] = cell.position.x + rect[1] = cell.position.y + rect[2] = cell.size.x + rect[3] = cell.size.y func get_row_rect(i_row: int, rect: Array, key_format: String = NODE_KEY_FORMAT) -> void: - assert(rect.size() >= 4, 'ошибка: мало элементов для возврата результата') - var cell0 = nodes[get_node_key(key_format, 0, i_row)] - var cell1 = nodes[get_node_key(key_format, columns - 1, i_row)] - rect[0] = cell0.position.x - rect[1] = cell0.position.y - rect[2] = (cell1.position.x - cell0.position.x) + cell1.size.x - rect[3] = cell0.size.y + assert(rect.size() >= 4, 'ошибка: мало элементов для возврата результата') + var cell0 = nodes[get_node_key(key_format, 0, i_row)] + var cell1 = nodes[get_node_key(key_format, columns - 1, i_row)] + rect[0] = cell0.position.x + rect[1] = cell0.position.y + rect[2] = (cell1.position.x - cell0.position.x) + cell1.size.x + rect[3] = cell0.size.y From 8838330f2dd744871e63b4b8aa241f4ae1fb5f92 Mon Sep 17 00:00:00 2001 From: MaD_CaT Date: Wed, 19 Jul 2023 11:43:08 +0300 Subject: [PATCH 2/6] =?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=BD=D0=B0=20=D0=B2=D0=BA=D0=BB=D0=B0=D0=B4?= =?UTF-8?q?=D0=BA=D0=B5=20=D0=AD=D0=9C=D0=A1=20=D0=B4=D0=BE=D0=B1=D0=B0?= =?UTF-8?q?=D0=B2=D0=BB=D0=B5=D0=BD=D1=8B=20=D1=82=D0=B0=D0=B1=D0=BB=D0=B8?= =?UTF-8?q?=D1=86=D0=B0=20=D1=84=D0=B0=D0=B9=D0=BB=D0=BE=D0=B2=20=D0=B8=20?= =?UTF-8?q?=D0=BA=D0=BD=D0=BE=D0=BF=D0=BA=D0=B8=20'=D0=9D=D0=BE=D0=B2?= =?UTF-8?q?=D1=8B=D0=B9',=20'=D0=A1=D0=BE=D1=85=D1=80=D0=B0=D0=BD=D0=B8?= =?UTF-8?q?=D1=82=D1=8C',=20'=D0=9A=D0=BE=D0=BF=D0=B8=D1=80=D0=BE=D0=B2?= =?UTF-8?q?=D0=B0=D1=82=D1=8C'.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- data/document-new-0.png | Bin 0 -> 1961 bytes data/document-new-0.png.import | 34 ++ data/document-save-0.png | Bin 0 -> 4079 bytes data/document-save-0.png.import | 34 ++ data/edit-copy-0.png | Bin 0 -> 1967 bytes data/edit-copy-0.png.import | 34 ++ data/кнопка-эмс-0.png | Bin 0 -> 574 bytes data/кнопка-эмс-0.png.import | 34 ++ data/кнопка-эмс-1.png | Bin 0 -> 509 bytes data/кнопка-эмс-1.png.import | 34 ++ data/эмс-бланк-замыкание.png | Bin 0 -> 989 bytes data/эмс-бланк-замыкание.png.import | 34 ++ data/эмс-бланк-перем.png | Bin 0 -> 704 bytes data/эмс-бланк-перем.png.import | 34 ++ data/эмс-бланк-пост.png | Bin 0 -> 483 bytes data/эмс-бланк-пост.png.import | 34 ++ data/эмс-бланк.png | Bin 0 -> 787 bytes data/эмс-бланк.png.import | 34 ++ data/эмс-указатель.png | Bin 0 -> 318 bytes data/эмс-указатель.png.import | 34 ++ project.godot | 3 +- scenes/header.tscn | 6 +- scenes/nine-patch-button.gd | 30 +- scenes/tab_switch.tscn | 7 +- scenes/ЭМС.gd | 190 ++++++++ scenes/ЭМС.tscn | 102 +++++ scenes/журнал.gd | 20 +- scenes/кнопка-3.tscn | 13 + scenes/кнопка-4.tscn | 13 + scenes/кнопка-5.tscn | 3 + scenes/кнопка-эмс.gd | 56 +++ scenes/кнопка-эмс.tscn | 51 +++ scenes/контроль.gd | 58 +-- scenes/переключатель-эмс.tscn | 24 + scenes/работа.gd | 142 +++--- scenes/рамка.gd | 12 +- scenes/состояния-эмс.gd | 5 + scenes/состояния-эмс.tscn | 40 ++ scenes/ячейка-1.tscn | 7 + scenes/ячейка-2.tscn | 11 + scripts/repsettings.gd | 36 +- scripts/threats.gd | 46 +- scripts/tools.gd | 62 +-- scripts/yems_devs.gd | 44 ++ table/table.gd | 681 ++++++++++++++-------------- 45 files changed, 1450 insertions(+), 552 deletions(-) create mode 100644 data/document-new-0.png create mode 100644 data/document-new-0.png.import create mode 100644 data/document-save-0.png create mode 100644 data/document-save-0.png.import create mode 100644 data/edit-copy-0.png create mode 100644 data/edit-copy-0.png.import create mode 100644 data/кнопка-эмс-0.png create mode 100644 data/кнопка-эмс-0.png.import create mode 100644 data/кнопка-эмс-1.png create mode 100644 data/кнопка-эмс-1.png.import create mode 100644 data/эмс-бланк-замыкание.png create mode 100644 data/эмс-бланк-замыкание.png.import create mode 100644 data/эмс-бланк-перем.png create mode 100644 data/эмс-бланк-перем.png.import create mode 100644 data/эмс-бланк-пост.png create mode 100644 data/эмс-бланк-пост.png.import create mode 100644 data/эмс-бланк.png create mode 100644 data/эмс-бланк.png.import create mode 100644 data/эмс-указатель.png create mode 100644 data/эмс-указатель.png.import create mode 100644 scenes/ЭМС.gd create mode 100644 scenes/ЭМС.tscn create mode 100644 scenes/кнопка-3.tscn create mode 100644 scenes/кнопка-4.tscn create mode 100644 scenes/кнопка-5.tscn create mode 100644 scenes/кнопка-эмс.gd create mode 100644 scenes/кнопка-эмс.tscn create mode 100644 scenes/переключатель-эмс.tscn create mode 100644 scenes/состояния-эмс.gd create mode 100644 scenes/состояния-эмс.tscn create mode 100644 scenes/ячейка-1.tscn create mode 100644 scenes/ячейка-2.tscn create mode 100644 scripts/yems_devs.gd diff --git a/data/document-new-0.png b/data/document-new-0.png new file mode 100644 index 0000000000000000000000000000000000000000..c95c45a6a636ec513ea3da615a93babf57f846dc GIT binary patch literal 1961 zcmV;a2UhrrP)aMPH&i9>j>c@mpdHVDz;SW?E zK77akKmhRg@#BJ&a+8@0e+1!)D74ldJbLsfREZMX?g@_0M znE9K|v+mQL@$Zds6h+}+FgOl^pu^1WJLG2oO|A7`8;wR&jRq|cpeX7^% z7iO(Ejwy;F9Rz`X|NedXUO)_>-EmOD};a$0wddjnc^GN=qq~ zlu{CrOsEaOjY=HHv9Q*z1Mo%vpaELgL zVT^(A`?!4hGOewxiPhEBaYC(BDs=DOJ@@I;r&_z+Mi_=#2th&!>HGdlCWZ3ydmhcw zu8D(3Q3Pu(Zr{F*<>louNYme~R;#jFtpdPWx7&5kpFf9lPD&}4G7(r*iFpp62u(yF zA_yVSZntrIdJ1O7ojZ4Op|`ucYn^j~h)4)gIO79Z2&8d-o}x)I%4)aP!We^tg9E&I z^JcE_&1Mt(`}=nCQ@Ncu4S{*eWc?OGKuS5zxI~1VogJiQ=A`udefRR^OCC*2lCe#u z52Ot|nVc4h{nJG$g<`P?V+@!XCnqO}q6kqGW%e<~5Hoj~ISHfAId_uk16k1}kMmB` zWHK8kzl9Je7K?Dsjr}1BuUSQF4FD}`ZQVJ?qp3yL_x5Fuw1^MP z%e>Q6O71<+8w*cFI6gjxwHD=a8Cq)uLBLYVUpt*nyVL2kthKQ*CXC}4lk16dXX1-M z!}tAhRMJ|*7z5`Vip3)K_V!q7{om1K?z1t*Gsc9|fo5hDTGX<6qSf?!p65X+g(!-~ z^P@_o0%HsS{13oqBKp$n^;VeKo|&5Dr9)bRO5%9dJIV7|bR7eY-^QOsJ4xHA1p0npQ=G^J@B%kM@k>}l6QEa+>Fc{#6P$-Kkd4rBW&G_xq7ChJHT-{Pw$QI2?)~2y~%P5Y9Qgc<}9UDG$KL83n>Hbfr?s6bc0GB!OY{ctn(Zx z<;e}nCa;t-*_H6>^?JQrE~8K=KuS5u2p+A$d3$>ss!%AnQmHiXJa1PiohDnUd%QiewrLI_R-A6=V76as*1x7)VY>+Nf;|7NW%T5D-k;hZDq9A!m- ziz-seu~mf-JVJuC*3R=h$IMVlv6PZWjvg9g4!5_r#}=hVqd|vV7iuEjqGHp>?XN4dxPxj6q7X?MuuqY>y~4 z&A!B7h{$$j$&h5br+Mbgd7hd7nRCwjy~}qJ%uV&rvRz<YdhCz(P? zbg|<-{c82#>iLFWOiCmVwWool706&xg(i92^|%4dknb>>;!E zpiri{8<3+r!~?~^4nuWBOb0ZlxOBOK^2-{qvb$Sb<`uUpuw|peP-J|;TJ!qBapXN) z$E)m?OWNDV;!vXh7o&5Lr#o0`SPPB`23#rJ`T&* zm7xRFnW#|5b-5K1iPYZT-_MG{3}T<|QV4W!o2OUrlO-n`&f3$sU`%fn&=q4k<<@s~ zEwXbG;>Dom<)9;WcJ|%J=jFq{b*-;|*{zhq6o%<$?m>ZB@{SuC>^oPgTfyU~(zTzH zo+=^jRO-n=DZbr{jC7oFEq$7uAPL2=%}%ttS6<^2F?H+*)&2AEYp~ z?mzoFbbp&veDZL0M8dS>hSyE9VW=IQC)TFZnV?Hu+rMJ1*5s4DBrNFkx8 zTB6Y%D=X6deSJe?6}SIL6tl#TGF+8L*LLNYf2=o3DqOqf7U!($MPA~g`7PVgj@t3$ z^TwmZ67;;P9x@i*$@%Us*TTXAlAqs5znMxEM#FG=0^RXN@IFLu?aE@7V`-}9aW;)c zd(yjDlB5S6j$M=N=&NgKxzp;uKIJ&opl&6@OLe1v*X>m3@vY0a%r?kK>&Gcxy&7Zq zBAr>DWH^M96LbKEH*B#bA6p)Z;|;omFgI>HxuCV;DHvc%6?(*QwRq*fYwW!uB|NvPkOj9jr+A4 zx7jHSMjH)^m%pqHe-bYBfeT>%Kp+n1=C+z)rtukDsh6^FlMe&6vd`tfcpxMaX)}WA zXNk zPXXofyz2X%9n>$HkBo44`xqw{J&0OIMN*-yIJbdF3Z=+g`Xi!~v$waGc<`NI$rH0N z-Smk6nirha#)4<1`8TjlvSc=2{_=|sqJ12mtYC7ET>4ke@Vfu7r^+aERzL2uswo+F zj&-D0o@(6L*||deQ{)fB4tKF)HzPQd`0nml1K~}d6K=p&X@X8KUR=EA)kv4Qw}s(W zG+`(v2nY!oD*WrJ1l|e=@zb)Ev52oFk|mqx_!gO3zwa+U=g`Q~lFM3iRm#bZzY9@} zlPfAJY;0}0(6HG(s~N+gQoIh$ugfRNza_b|^9I@iMsIl1k8`%=1z4EmB?*f~IU|Ss z1f7vZ)|ZEy9xh8i9~6g26(h^|li%kKN~FOa7OVwpp}YDX*q`6qnCaYIqwzuDs08|@ zl@j%?&!0bANr<_0GSq;Dh@vkm^J!8jrF)l2hKUQRGK&)Tbp*P-1$zw<2t;%#K31D^ zq7TujU|uoi?&n7e2ncAhlgsEs`(}cFTx-VH2<@sVtz0#ER3t4@gkrs!maKQm$jIm} z9&g}DAQTR}*El1IT~qYF(2e7xgJN-U@j*#IlV#tgPX88y(kph65!6`#z-zy?r_x!y z9wTg}-^BzeT^c|cHXfwNMK^S`0^%EhjWItjHrp1GRV=L|msNaD%G4=17(4mt6Y!{u zk0q3E3#kXA_UxD;1y$9+nwFM|_dZ{hlv}EdfX)7r6!qvk-P4v=P%%8!mW6M~SEYoM zws}oOCD6y`iTCvDH-N~c_`44ta26LA6E~*+s3q`Ie~wkp2e%FE2HSJT$Gg|i*V{#+ zw-(#-bqlKSSY-D%1?3D1Wo0+GuDQ7MA~6@afL=k!3X#v3l&;+tm(>6}PJs z^;3nkF_@j*U1wk4^nqu8+yEg{LZLiU7ZMOC3Dp?v$5}PxGDixy6|t=5^2S<+AP|UFJ4F-?~IxSg@xq-U{rG7 zb#=i^pKF+undVvA(R3@u-fnEjfl@7~0`Z&Xs~G@7Pt45Ro82=QMHybis;R1S4oX1K zqHj>SLpAlx98CGuf+|RQajb*G5-^uk0$q}?KwrXlZ^QoAO8ZOwxznpeC%Q`FJF&|o zHXy__W9BiB-$8G(DgwgpCfz}Xx7@N^`pT6nI;EZvm$DnS@~JS4=|k`~38tr~*Kq6B zt*1Hr0??!Q=zmy2?bWVb)8{7EW8aak-0lLR-rU@L6rVP@3=&h@%E}4_rj!Md6qmsK zxZt)FV8qRG=|wrb4X&l`uCCE%SXhSLQ8sYx#3DGfr8ZbT=Hb(17and@PWjKfSUUJr zhpIArw@*!bdkTpj z=p>X=nqXOu2F0ptYwOQ5jpNZ3#Vsiy`mvR~LXWiy&40K@M4W7%V+Iz|kIM-EIr=;i z)Z;0s&Q5Oh-+$pI#>VCv&&}8iGJ*EWhcg;g?kVx1a!uf(TT}O|FWtCt1BF7N zYiBZ#-=j=imH1RsGRDtLYDPQ9J5i={ zZmvLtReI1j7`-D5eZfjd6{Ew#!giK&y+=TL>;|jXVJqvDK-~GaMApj(1qqV7yWkr6w@gi{cAaB$S>~~RaIS(ekHQ%*;FB=zw1Mc0A$3tk+-(jVV52<~ z6Ua-6MHLhZxpeXp$xwUyy2kj({M)y0&odZ|MyRicEE3%@KF+HG{Ken@>6h)t0w#Fb z3(0y@{5Sc%ka`}lMc1(7=wpc|D)EUJI`@+E1s%#8X%x@Y>DE&q{8?GUP` z?=8wiEpQ78*qG*e_3Blkak5#JDcU01b(b$?L96QPY3($urzi~EBho&&j!*<*ouv|s zQe!wZFJ<*o1DEpxm?3W{kijpz!9DDqy)T?DMDnvQ1GzFaJ^kg;qf;AeYvPkb!k3~S z2(W~Ngn+CAxwUExnoOGCXa}!OfkSmSdMBn7f5JBBCf~L*G9%u*_Pr6C2YR$XRZYzk zzR254hGE2*-lo#rYW^LVp&L_DLEgJ_g@p^noy9SM4ove81o z!cUWvAoZNn3GUUj&ZQ;EhK2_7%3Cc`X8A-#@7{>#=QP9#=6K!ZKt3aAjqMorQ%3G3TAm z$Q96Uw5>1W;{0&NSKgK{KX@t@TWAhC3+1p`H@s{#Cx}#DA+QI6@G={kB9I`;Vh}W@EaeqeEU&N-7KJYHRuWJnT?1GCp0V tAUv;|;2#i>?As)8D6HXiuD6?T%#ShG#cxm;zTmPB8R(j#t8|>A{s)Na*mM8@ literal 0 HcmV?d00001 diff --git a/data/document-save-0.png.import b/data/document-save-0.png.import new file mode 100644 index 0000000..6c1da76 --- /dev/null +++ b/data/document-save-0.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://coqg6wsftvtxr" +path="res://.godot/imported/document-save-0.png-beb8a5dba6cf2046205d50b7f2a0303a.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://data/document-save-0.png" +dest_files=["res://.godot/imported/document-save-0.png-beb8a5dba6cf2046205d50b7f2a0303a.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/data/edit-copy-0.png b/data/edit-copy-0.png new file mode 100644 index 0000000000000000000000000000000000000000..3127b1e028e868b66fe5aed098b2c4240fe8b68f GIT binary patch literal 1967 zcmV;g2T=HlP)TQj?^*a;R1&xr@UG={AzVFqmswMzXsZ=Nc z9e{>UqqzWhwOSRVQmJSF@&FdS&+j`30iX@wC4jc>d43VVF94htLd1m-^#5UrrfIIG zX>!cRECAmC_zQq-KV$87J8}8)W#hty3sg#Zpx!5hpja$+Yqi?5`T6^PoF;h z@AK!+|M=p?i*Lv2Lyz*R0?=x;LIDs$P_NgKOeS&a)Tv1+mjduJ&NnIcoB$-V9XnA@0Ys<1efAHYJUkA}@ zAOIl*T-QY+k-);jLewM#%d-4?rxCpn0-C1b!-o$zcI?=~wQJXYZ&?<5{P^)buWT5P zLQ+b&t_#jNdc9ucBxP9^D5X9C(=^d&G$sOL+cvhgws83HVVpQ|;s-Zw-1y2gO}4VK z@~5#Qpt6u@nrJqgkpP;_CW^&kALZ2ZW0n*s7K`X~IuJsD5Q38@PtM=GdGm`~w{DpL z{x)cO4yBMX#I|i%mId3k`>r5;R0O1ya2yAm^RX_*7!1Sk`&7T5IdkT->({UU?)L55 zmq!Mmj8R@xo$I>ZcQMAGX<8ou^^5{D>ecCV@aokobUGby&im}Sc=6(qt5>i7_R*t9 zN5@K|N&~iShjLnZNg3g~E;LO;Hk+MD15!$CZf@e)vu8dC)!(H{m(H4|`Ri7zwNoe* z1_MwYRbJI~J(Sa4E#n(6gaD-!Gcz+2XQQ)c&!W+2pkA+IZEX!38yhf96QxoK3kwV9 zR#sLv&YwTuH)%$S*l`>fhJm@cxzIX>QtFFN0p^^e)9Fl=QuFz|KSny8M!VgHrfFb| zk;TQu`DU}(E0s!vDWqx}$8lhqW@Ih1v$KO(Ear>ewr#XpEx4`=LdZlkQqIU^GN6>A zR4RcnhS}L!bh};s;lqbys0M;*^zGZXku&l3_BIY3I@Bj%Ldehpa8Q9qDTS00#bOb; zTn?#J3aL~I@pv4sU%&pS?|~Xn(|i~JN~u3sFzu?$G)>cW9r=77x~}_LBZP$7F)#w0 z^FAp|CdO-rRxh{a-{lzueH z4b*@T0=-@j?RGoTQ=Lu+Gcz-N095p*+V~LymSrKA%k^nWO`0Q>(?Kv%6jG52PJGj3 zA?5KzBH@cUxYig+17VqHSngI{S5@VH?Ii`rkJ42rg;e%YwMbM6oXKQ9qFuM!-M1Z$ zL?QvhF#P@$Ge%yK4MMKcXE1BowjHUNNt$Vz$Y!%(jEzU3U~X4gB}~Nc-n~OEm-Dkj zSeBTk1r3j)bmXF5c{Hk=CWQ1wD!3+?ltPR#f0IDbR5>Q9BG3ob`9Wi&#HQwp;H(_R z)lt{Q+uPfHW2Dn*Fvk28Jv5Cf5J4@3Ay*L!3RrnjCX=CIJHdM=vaPKxGCMnKaL%a$K1~^+ zC~Fu-ACO>yIS@cTpLf^S*T1dRYX9EY*jTqL%N|rk0QhWqd3l+0KBuCUOeXhD13_&? zEtK@Vp<7y7YA-D<{T;x=YPCA-=;v5G9{-gPVqaG=VTML+GV9Zx7L8N*O99<6x@Y`0c8~Aj@qg@zXPQO)I78vPR}HoSxH*btp3R&9fcM7Ar}VmwfcLu1{{Ym|z>-_J<3s=e002ovPDHLkV1j7I Bz4!nC literal 0 HcmV?d00001 diff --git a/data/edit-copy-0.png.import b/data/edit-copy-0.png.import new file mode 100644 index 0000000..e78a790 --- /dev/null +++ b/data/edit-copy-0.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cywuevvpkxl7v" +path="res://.godot/imported/edit-copy-0.png-669a30c517f56dcd05ee05650e14794f.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://data/edit-copy-0.png" +dest_files=["res://.godot/imported/edit-copy-0.png-669a30c517f56dcd05ee05650e14794f.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/data/кнопка-эмс-0.png b/data/кнопка-эмс-0.png new file mode 100644 index 0000000000000000000000000000000000000000..6efdc17ebeebb825f729ce83378522316ea3cfbc GIT binary patch literal 574 zcmV-E0>S->P)6#o5Xb+Mcc*uR zU~-~`AQrJqqc#>6VhXW{rJZFyKnh#^1~z^G!6xmsVk-!OLM#FjLJ*XI+6W2ea>@N{ z{tt%d<-GUKfn|4Qc4l^FcVrw9ryBxGkycbx4}p>Re4jh38`rNh<1i z*_t+t5uu1UHNGgR0~8T)lJ`c08bdxgumK$KHw=KM<78$rykq6-z=cHb0*}r64zwG4 z1{7X@1@@+p`3M|%T{Q9(cn+K zi$K&hx?bE2j29H?t=G0C-#Bw}JB&THl8# zfVsvc4wwfHfnUJ=G5ou(MgW&)t)Y?DFH$J?fo}y3 zm9-<{3$Wuv-*tx=x?ldkj&Ef{qvt#%>7-86ZThGA>`J6M{~1a814(m0AwZdSLI3~& M07*qoM6N<$f*Z#5l>h($ literal 0 HcmV?d00001 diff --git a/data/кнопка-эмс-0.png.import b/data/кнопка-эмс-0.png.import new file mode 100644 index 0000000..deda1ed --- /dev/null +++ b/data/кнопка-эмс-0.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bvxv33noium2h" +path="res://.godot/imported/кнопка-эмс-0.png-55c9c814b93a55a54b5133cafc1cc584.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://data/кнопка-эмс-0.png" +dest_files=["res://.godot/imported/кнопка-эмс-0.png-55c9c814b93a55a54b5133cafc1cc584.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/data/кнопка-эмс-1.png b/data/кнопка-эмс-1.png new file mode 100644 index 0000000000000000000000000000000000000000..481c192dfa6707f4f108eaa60d00fa33261d20ef GIT binary patch literal 509 zcmVa{8f357&NL_#EJBqv_Z`Dx~o&3Rm&-80E% zXLt6$vopIhvr+^BjeY~z3g?PaNoh1Ksp7mzDy+35Qc>ppr#DH;Vyr9`b)%Wd%<4Yw zlT-#WGy4kHnwgR*JUOrqRQXLGz-At%9mQ9^`5Mq0%vXR_mpuZV$(8|`^LM~aj=ULj z3RIoXk}L(bfqE-*iW^v?5$H8+ExJkzhN8No;750GVh_JW-4%-d<58$Xk;2*ek8PJiO;(%`86?g#_a^$m~ zjR1z)&7l_XJ3+#J0PchFZXTxXis9oC;21aqMq8~-s)vn$_su%Z>=w9^R57z_uMjn_ zm;YDseY2VmySz!#S4`1O{nK1}CQ{6QMv{I2EKI48Vxai(00000NkvXXu0mjfF*e#Q literal 0 HcmV?d00001 diff --git a/data/кнопка-эмс-1.png.import b/data/кнопка-эмс-1.png.import new file mode 100644 index 0000000..cb68680 --- /dev/null +++ b/data/кнопка-эмс-1.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://nfpish471rjj" +path="res://.godot/imported/кнопка-эмс-1.png-5000e69bb949ac3e094bd419f59b8ee8.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://data/кнопка-эмс-1.png" +dest_files=["res://.godot/imported/кнопка-эмс-1.png-5000e69bb949ac3e094bd419f59b8ee8.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/data/эмс-бланк-замыкание.png b/data/эмс-бланк-замыкание.png new file mode 100644 index 0000000000000000000000000000000000000000..e1e8864f54425553ac0d45f3f06215ca688617a7 GIT binary patch literal 989 zcmV<310wv1P)lX!iNvHfgY-JI5#HCb~!jWBu#USvGVAV zyEMb$Fd&XYlB6BX&v)r`76^iwK;#%0@!-KT;C6J*rw4oi+@`Km@_d~<-^AL#fI}S) zbKnA~4u`?y;Iy%}OP=@1^8t;<5{*Uz{04kI-G3e|LG>2aevC0fQQX6rO;p!_O<)3g z|9(NMWhsh~x^4koppWVRW0on30iDh}grO3KipcjsaS_bgG1eYoOhKMsqbTOEb`jNq z2U{ZuHi_dAt=1{lzJYT+oEreks1C4pk)lY*b46s2I6fi_$3FXWU{$q4Sw5vGBC>3W zvh3kp0wh3>AQ%wGo3z{Ov|5Ka*TuOdj2Ylu517R{D9eiY(3}Zw< z^^mIi73aRixt}m*3+E27HpAL_3K2}oN|Du7WjwYRQ{Y?*ya4tQIU)=*qDYCNh$w0h zh7F>q;nzwSW{4aC`@jpFOEIQkJhrmBs(8JKrroZ?VGOj-stfJ{AK}~`jF~0R9YJu4 zNJ<=M7}H@qPRR2ZV`g#g4p0FtVB@TMhr@iTCK0NLhyquETfh?VJ}~f2o?r~9?qcl- z=eB4z4=Kwor>EB`%N})|pn3zC2X6T4{TWyXeiso%l?aik`t*Sn;1lnVc&d+4-KMT5 zJ*WByWtmb{31xW`YnOd{EP9`NetsQT@YxC?zCb3N&UzK;105g*w$FM@b)qI^c|=_s ztc|huIjWnUg=PO;^!|O|Z(tVH;tb4lngUz?-XdVn({QF9sOHqQrLNVhLIxaq`xJBu zxCYcdUaHW1`OZebH^7gc))d(F!Cuite@3Unq4oAD=r5j51&)A`h}=XKQPrcbsNZb9~1UeZ=00000 LNkvXXu0mjfxwg~l literal 0 HcmV?d00001 diff --git a/data/эмс-бланк-замыкание.png.import b/data/эмс-бланк-замыкание.png.import new file mode 100644 index 0000000..1de097f --- /dev/null +++ b/data/эмс-бланк-замыкание.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dvl3sq036gn75" +path="res://.godot/imported/эмс-бланк-замыкание.png-4318b52796ef34b4e1884210148903b1.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://data/эмс-бланк-замыкание.png" +dest_files=["res://.godot/imported/эмс-бланк-замыкание.png-4318b52796ef34b4e1884210148903b1.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/data/эмс-бланк-перем.png b/data/эмс-бланк-перем.png new file mode 100644 index 0000000000000000000000000000000000000000..832a346c43b74227b515c53c9cf68391fef00acd GIT binary patch literal 704 zcmV;x0zdtUP);Yay;z%HDV_MxwdqyYuaC97&gb>E50I7xfjTnu@p+IN> zQ$Vu@1Ylj#8-TGma$r(trm&-hdl;F-MG7Bz|866E`P5emr+w(?n8r`M<@Ne^wY~z_ z-Ud$9fC!8h!LwYL$GVF^24keGj5<2*XZ+>{ja&U-$2qxdxPG4bYY%AL%gductT8Zz zQoav{mp~w$qd_}}N!!OHQ8{cV*{=;k*}3}1E1|L6zkk`6ZUDDSPO}&>7c#IP28v1= zS7s7O61J;CDnBk^21v=mrJ33S?p}-wb#OgtW*c^ZI!a3Z6ReGgLKQjN2rXM&Nq)^G z*tWe_Wcp=b-MkH3f|hZ!0&G*#Cgztw1%I~z+%yV;t!`a~GBfwkdSv@4($5O8JBEkF zJx;2t*M+u_n*AL}(Q!#=L(+>yFN_;ULBtXwfWgA)HW!7)qFTD{UJA`~6M(Q18sBW6 zH9lO+ky~?ddLFnh6Oke~AF>ARTIi=NO2MeWPJsa_%z64M@EK5H5bsi`1N(B0WRb#? zsp+5z?=y9}e5VVg&*`qARus3&^VM0M zyGZi2DN(S;On>QCon|CG(fTvsAfQ_Q=gb%nWo>(Dl$_T9sH)oyaK!So&<{n&30X7A mML9*;&yxR`m#-_I{@NeyKQyNAyD-840000yF`#vO$+8m?wl8J-D{utd5V7x+ zUISh>5eY~czas&1*6k}|kCa}3Q{bt}=Uhv=E0+gpG&(JYnjJ+Tftby11P=hVUxAY< z<8v^-J)M35ery*Bjec&as zRM%I)6>lJk|0wUB%zj&zf}i-8V%n8!{u^y18Nk!&pwZ=DukLrxEp1T><<3&Q6&;dN zT|Y=NHdT4|9OLmh@XHXggF=M8Aney%Au^ys=tWABAbC9g2K)h3&FeFzL*RqjRyN+X z&N?0y1GET7#~9lbT=#Qkm#$#D<4He6>W8clsL?fs<<)L=5DCofZLQJhv%xC-T9fQ8 z=8z21Y<2;B%wf#Qn_%yi*e>_$2!b=~0e2wlq<8)@{&@!*L6v0Oi>E Z@-MY$$Qk0s4~+l-002ovPDHLkV1gnn*~tI^ literal 0 HcmV?d00001 diff --git a/data/эмс-бланк-пост.png.import b/data/эмс-бланк-пост.png.import new file mode 100644 index 0000000..9f1b42e --- /dev/null +++ b/data/эмс-бланк-пост.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bwddxs24es81u" +path="res://.godot/imported/эмс-бланк-пост.png-26bac763879d76be257d6217d43b0164.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://data/эмс-бланк-пост.png" +dest_files=["res://.godot/imported/эмс-бланк-пост.png-26bac763879d76be257d6217d43b0164.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/data/эмс-бланк.png b/data/эмс-бланк.png new file mode 100644 index 0000000000000000000000000000000000000000..7762ebc2db5f43fd8a6d0942e97aac69bf29d02c GIT binary patch literal 787 zcmV+u1MK{XP)sV5G*eQ-dJRzof-TK{sy77enS6ZwD8LF0S1GS!6HE+ z1Z)UOnBZ9QjBqmD?`EMMsU;jow%?}cs_J*{tNW_7y}kWnFc>V_RydFaV8lfjP-Cp; zjFHsXW_0nRj7drYJRA=H(%#jvJRgbb6Ogm&pbabm|MYsj?`&7OBqU9N2{4lM2QdALswzntP}I=Aq*9Xe z#-_3!+d$WLQ7g?q160K6SS6x*Ljwl+Heagg{;!-J1Qr>mtPznCg3z8vRP%aoq(G_CnDN_t|S)H zxqMw(xLjTRt+3m`0+7xtv#p3IB;5i!KR$judGqYq$PsPMMCgBxun99#D5VeMqoc8; z9zaC2fRx+Ls;asn>GtCN`~9e@ZdI0Zbtmc?eqHv>wj)w+c{$5gR@$TI&)=41*{!Oo z$Zh8*Cnue69zE)>KX|ZU5D{47+_So4)ttNPS!2F_)ou#-qH2P%S>svU2?N>4~5 RU+(|_002ovPDHLkV1o2ifWH6$ literal 0 HcmV?d00001 diff --git a/data/эмс-бланк.png.import b/data/эмс-бланк.png.import new file mode 100644 index 0000000..a6a29c1 --- /dev/null +++ b/data/эмс-бланк.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://belwchvdktrw0" +path="res://.godot/imported/эмс-бланк.png-da5900abaf207dcfac692be656729ba5.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://data/эмс-бланк.png" +dest_files=["res://.godot/imported/эмс-бланк.png-da5900abaf207dcfac692be656729ba5.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/data/эмс-указатель.png b/data/эмс-указатель.png new file mode 100644 index 0000000000000000000000000000000000000000..38d5631302fa4cc94bd056ae5e73854024534636 GIT binary patch literal 318 zcmeAS@N?(olHy`uVBq!ia0vp^Vj#@H1|*Mc$*~4fY)RhkE#}JFtZ>KnNwJ3~R*`(3V90rqE~Zy)FmI%U@XSmJ4962pX`TWRMkk5){(k^k-~*WUe5JTf_7r)9ym+_fghCLg_Q5_s9fapmdBM-LkW z#9jxp<`l15rKM5&^KE?Kw5Q+KinB^4`+e2^_vHL1wzzv+ZDRO-6#>1);OXk;vd$@? F2>{_Ggi-(i literal 0 HcmV?d00001 diff --git a/data/эмс-указатель.png.import b/data/эмс-указатель.png.import new file mode 100644 index 0000000..f3316d7 --- /dev/null +++ b/data/эмс-указатель.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dahjma3aqkfc0" +path="res://.godot/imported/эмс-указатель.png-35341c0a7eb002ba8773df81a1ebc5f8.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://data/эмс-указатель.png" +dest_files=["res://.godot/imported/эмс-указатель.png-35341c0a7eb002ba8773df81a1ebc5f8.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/project.godot b/project.godot index dda7022..2d08c71 100644 --- a/project.godot +++ b/project.godot @@ -27,8 +27,8 @@ REPNetwork="*res://scripts/repnetwork.gd" yau07="*res://scripts/yau07.gd" Log="*res://addons/godot-logger/scripts/logger.gd" Table="*res://table/table.gd" -Bip="*res://scenes/bip.tscn" Threats="*res://scripts/threats.gd" +YemsDevs="*res://scripts/yems_devs.gd" [debug] @@ -38,7 +38,6 @@ file_logging/enable_file_logging=true window/size/viewport_width=1600 window/size/viewport_height=1200 -window/size/mode=3 window/subwindows/embed_subwindows=false window/stretch/mode="viewport" window/vsync/vsync_mode=false diff --git a/scenes/header.tscn b/scenes/header.tscn index 0762438..7782157 100644 --- a/scenes/header.tscn +++ b/scenes/header.tscn @@ -1,8 +1,4 @@ -[gd_scene format=2] +[gd_scene format=3 uid="uid://bnfmccbgrffps"] [node name="Label" type="Label"] -margin_right = 122.0 -margin_bottom = 34.0 -custom_colors/font_color = Color( 1, 0.596078, 0.4, 1 ) -valign = 1 clip_text = true diff --git a/scenes/nine-patch-button.gd b/scenes/nine-patch-button.gd index f810563..3179f10 100644 --- a/scenes/nine-patch-button.gd +++ b/scenes/nine-patch-button.gd @@ -4,28 +4,28 @@ extends PanelContainer @export var texture_state0: Texture2D = preload('res://data/кнопка-квадрат-0.png'): - set(val): $state.set_texture(val) + set(val): $state.set_texture(val) @export var texture_state1: Texture2D = preload('res://data/кнопка-квадрат-1.png'): - set(val): $state.set_texture(val) + set(val): $state.set_texture(val) @export var text: String = '': - set(val): $button.set_text(val) - get: return $button.get_text() + set(val): $button.set_text(val) + get: return $button.get_text() @export var pressed: bool = false: - set(val): $button.set_pressed(val) - get: return $button.is_pressed() + set(val): $button.set_pressed(val) + get: return $button.is_pressed() @export var toggle_mode: bool = false: - set(val): - if is_inside_tree(): - $button.set_toggle_mode(val) - get: return $button.is_toggle_mode() + set(val): + if is_inside_tree(): + $button.set_toggle_mode(val) + get: return $button.is_toggle_mode() func set_text (val: String): $button.set_text(val) @@ -33,8 +33,8 @@ func set_pressed (val: bool): $button.set_pressed(val) func set_toggle_mode (val: bool): - if is_inside_tree(): - $button.set_toggle_mode(val) + if is_inside_tree(): + $button.set_toggle_mode(val) func get_text(): return $button.get_text() @@ -43,9 +43,9 @@ func is_toggle_mode(): return $button.is_toggle_mode() func _on_button_toggled(val: bool): - if val: $state.set_texture(texture_state1) - else: $state.set_texture(texture_state0) + if val: $state.set_texture(texture_state1) + else: $state.set_texture(texture_state0) func button_connect(button_signal: String, proc: Callable): - $button.connect(button_signal, proc) + $button.connect(button_signal, proc) diff --git a/scenes/tab_switch.tscn b/scenes/tab_switch.tscn index 3363bfb..aec5f96 100644 --- a/scenes/tab_switch.tscn +++ b/scenes/tab_switch.tscn @@ -1,8 +1,9 @@ -[gd_scene load_steps=4 format=3 uid="uid://3slb0i3pvowc"] +[gd_scene load_steps=5 format=3 uid="uid://3slb0i3pvowc"] [ext_resource type="PackedScene" uid="uid://b276iygic5itk" path="res://scenes/работа.tscn" id="1_uow82"] [ext_resource type="PackedScene" uid="uid://lwmw4egynmd1" path="res://scenes/контроль.tscn" id="2_83m7a"] [ext_resource type="PackedScene" uid="uid://trt0q8th3bn2" path="res://scenes/журнал.tscn" id="3_hgnup"] +[ext_resource type="PackedScene" uid="uid://c6uls7q4e2m4h" path="res://scenes/ЭМС.tscn" id="4_2bmbm"] [node name="tab_switch" type="TabContainer"] offset_right = 1600.0 @@ -18,3 +19,7 @@ layout_mode = 2 [node name="журнал" parent="." instance=ExtResource("3_hgnup")] visible = false layout_mode = 2 + +[node name="ЭМС" parent="." instance=ExtResource("4_2bmbm")] +visible = false +layout_mode = 2 diff --git a/scenes/ЭМС.gd b/scenes/ЭМС.gd new file mode 100644 index 0000000..b11ceaf --- /dev/null +++ b/scenes/ЭМС.gd @@ -0,0 +1,190 @@ +extends Panel + +var TableHeader = preload('res://table/header.tscn') +var TableNode = preload('res://scenes/ячейка-1.tscn') +var CellYemsButton = preload('res://scenes/кнопка-эмс.tscn') +var CellLineEdit = preload('res://scenes/ячейка-2.tscn') +var CellState = preload('res://scenes/состояния-эмс.tscn') +var CellOptBtn = preload('res://scenes/кнопка-5.tscn') + +# Таблица с данными для входов, первое значение - индекс устройства в ячейке КЭМС +const INPUT_ROWS = [ + [1,['НРЛС МР-231S, УИЗП', 'X31', '0', '0']], + [2,['НРЛС МР-231S, Строб ЭМС', 'X32', '0', '0']], + [3,['НРЛС МР-231-3, УИЗП', 'X34', '0', '0']], + [4,['НРЛС МР-231-3, Строб ЭМС', 'X35', '0', '0']], + [5,['ЦИСВС-1010, УИЗП', 'X43', '0', '0']], + [8,['4302-01, 4302-04, УИЗП', 'X46', '0', '0']], + [11,['НРЛС МР-231S, УИЗП', 'X51', '0', '0']], + [12,['НРЛС МР-231S, Строб ЭМС', 'X52', '0', '0']], + [13,['НРЛС МР-231-3, УИЗП', 'X54', '0', '0']], + [14,['НРЛС МР-231-3, Строб ЭМС', 'X55', '0', '0']], + [15,['ЦИСВС-1010, УИЗП', 'X23', '0', '0']], + [21,['НРЛС МР-231S, УИЗП', 'X21', '0', '0']], + [22,['НРЛС МР-231S, Строб ЭМС', 'X22', '0', '0']], + [23,['НРЛС МР-231-3, УИЗП', 'X24', '0', '0']], + [24,['НРЛС МР-231-3, Строб ЭМС', 'X25', '0', '0']], + [25,['ЦИСВС-1010, УИЗП', 'X23', '0', '0']]] + +# Таблица с данными для выходов, первое значение - индекс устройства в ячейке КЭМС +const OUTPUT_ROWS = [ + [41,['НРЛС МР-231S, БИ', 'X61', '0', '0']], + [42,['НРЛС МР-231S', 'X62', '0', '0']], + [43,['НРЛС МР-231-3, БИ', 'X64', '0', '0']], + [44,['НРЛС МР-231-3', 'X65', '0', '0']], + [45,['ЦИСВС-1010, БИ', 'X63', '0', '0']], + [46,['4302-01, 4302-04, БИ', 'X66', '0', '0']], + [48,['НРЛС 11111111', 'X69', '0', '0']], + [49,['НРЛС-222222, БИ', 'X62', '0', '0']]] + +# Режимы работы выходов +const OUT_MODE: Array = ['Работа', 'Контроль', '1', '0'] +const COLUMN_OPTS_BTN: Array = [6] + +const TABLE_ENTRY_COLUMNS: Array = [2,3,5] + +var g_in_devices : Dictionary # Словарь с входными устройствами КЭМС +var g_out_devices : Dictionary # Словарь с выходными устройствами КЭМС + +var posx: int = 50 # Позиция элементов по x +var posy: int = 80 # Позиция элементов по y + +func _ready() -> void: + $tbl_in.set_position(Vector2(posx,posy)) + $tbl_out.set_position(Vector2(posx,len(INPUT_ROWS)*33+posy+10)) + $tbl_files.set_position(Vector2(posx + 890,len(INPUT_ROWS)*33+posy+300)) + $btn_new.set_position(Vector2(posx + 1270,len(INPUT_ROWS)*33+posy+294)) + $btn_save.set_position(Vector2(posx + 1270,len(INPUT_ROWS)*33+posy+344)) + $btn_edit.set_position(Vector2(posx + 1270,len(INPUT_ROWS)*33+posy+394)) + $lbl_online.set_position(Vector2(posx,posy-40)) + $marker_in.set_position(Vector2(posx-15,posy+35)) + $marker_out.set_position(Vector2(posx-15,len(INPUT_ROWS)*33+posy+45)) + $btn_flash_read.set_position(Vector2(posx+1400,posy)) + $btn_flash_write.set_position(Vector2(posx+1400,posy+35)) + call_deferred('init_tbl_out') + call_deferred('init_tbl_in') + call_deferred('init_tbl_files') + $btn_flash_read.button_connect('pressed', Callable(self, 'on_btn_flash_read').bind($btn_flash_read)) + $btn_flash_write.button_connect('pressed', Callable(self, 'on_btn_flash_write').bind($btn_flash_write)) + $tbl_in.connect('row_pressed', Callable(self, 'on_row_pressed')) + $tbl_out.connect('row_pressed', Callable(self, 'on_row_pressed')) + + +func on_btn_flash_read(btn): + await get_tree().create_timer(0.1).timeout + btn.pressed = false + + +func on_btn_flash_write(btn): + await get_tree().create_timer(0.1).timeout + btn.pressed = false + + +func on_row_pressed(i_row: int): + $tbl_in.set_row_selected(i_row, false) + + +func init_tbl_files(): + $tbl_files.set_header([TableHeader, TableHeader, TableHeader]) + $tbl_files.set_header_text(['Имя файла', 'Размер', 'Дата']) + $tbl_files.set_columns_min_size([200, 70, 100]) + + +func init_tbl_out(): + var header_text = ['Выходы', 'Разъём', 'мкс', 'мкс', 'Состояние', 'Частота, Мгц', 'Режим'] + $tbl_out.set_header([TableHeader, TableHeader, TableHeader, TableHeader, TableHeader, TableHeader, TableHeader]) + $tbl_out.set_header_text(header_text) + for item in OUTPUT_ROWS: + $tbl_out.add_row([TableNode, TableNode, CellLineEdit, CellLineEdit, CellState, CellLineEdit, CellOptBtn]) + var row_index : int = $tbl_out.get_rows_count() - 1 + var params : Array = item[1] + var out_dev = YemsDevs.OutDev.new(item[0], params, row_index) + g_out_devices[item[0]] = out_dev + for i in range(len(header_text)): + if i < len(params): + var cell = $tbl_out.get_node2(i, row_index) + cell.text = params[i] + $tbl_out.set_node_user_data(i, row_index, out_dev) + if i in COLUMN_OPTS_BTN: + var cell = $tbl_out.get_node2(i, row_index) + for opt in OUT_MODE: + cell.add_item(opt) + cell.select(0) + $tbl_out.set_columns_min_size([270, 100, 70, 70, 100, 100, 100]) + $tbl_out.set_callbacks(self, 'text_submitted', 'on_edit_entry_in', TABLE_ENTRY_COLUMNS, []) + $tbl_out.set_callbacks(self, 'item_selected', 'on_item_selected', COLUMN_OPTS_BTN, []) + + +func init_tbl_in(): + var header_type: Array = [TableHeader, TableHeader, TableHeader, TableHeader, TableHeader, TableHeader, TableHeader] + var header_text: Array = ['Входы', 'Разъём', 'мкс', 'мкс', 'Состояние', 'Частота, Мгц',' '] + var row_type: Array = [TableNode, TableNode, CellLineEdit, CellLineEdit, CellState, CellLineEdit, TableNode] + var yams_alligment_in: Array = [ HORIZONTAL_ALIGNMENT_LEFT, HORIZONTAL_ALIGNMENT_CENTER, HORIZONTAL_ALIGNMENT_CENTER, HORIZONTAL_ALIGNMENT_CENTER, HORIZONTAL_ALIGNMENT_CENTER, HORIZONTAL_ALIGNMENT_CENTER, HORIZONTAL_ALIGNMENT_CENTER] + var column_size: Array = [270, 100, 70, 70, 100, 100, 300] + var dot_collums: Array + var column_offset: int = 7 + for i in range(len(OUTPUT_ROWS)): + header_type.append(TableHeader) + header_text.append('...') + row_type.append(CellYemsButton) + yams_alligment_in.append(HORIZONTAL_ALIGNMENT_LEFT) + column_size.append(25) + dot_collums.append(column_offset+i) + $tbl_in.set_header(header_type) + $tbl_in.set_header_text(header_text) + $tbl_in.set_columns_alignments(yams_alligment_in) + for item in INPUT_ROWS: + $tbl_in.add_row(row_type) + var row_index : int = $tbl_in.get_rows_count() - 1 + var params : Array = item[1] + var in_dev: YemsDevs.InDev = YemsDevs.InDev.new(item[0], params, row_index) + g_in_devices[item[0]] = in_dev + for i in range(len(row_type)): + if i < len(params): + var node = $tbl_in.get_node2(i, row_index) + node.text = params[i] + if i in dot_collums: + var btn = $tbl_in.get_node2(i, row_index) + var out_dev = g_out_devices[OUTPUT_ROWS[i-column_offset][0]] + in_dev.out_dots = [btn, out_dev] + btn.button_connect('pressed', Callable(self, 'on_dot_button').bind(btn, i, row_index)) + btn.connect('mouse_entered', Callable(self, 'on_mouse_entered').bind(btn, i - dot_collums[0], row_index)) + $tbl_in.set_node_user_data(i, row_index, in_dev) + $tbl_in.set_columns_min_size(column_size) + $tbl_in.set_callbacks(self, 'text_submitted', 'on_edit_entry_in', TABLE_ENTRY_COLUMNS, []) + + +func on_dot_button(btn, i: int, j: int): + """ Вызывается при нажатии на кнопку-точку (соединение) + i - индекс входа, j - индекс выхода """ + print('on_dot_button(%d, %d)' % [i, j]) + + +func on_edit_entry_in(text : String, entry): + var indexis = $tbl_in.get_key_indexes(entry[0].name) + var row_i = indexis[1] + var col_i = indexis[0] + print('ЭМС.gd -> on_edit_entry_in', text, row_i, col_i) + + +func on_edit_entry_out(text : String, entry): + var indexis = $tbl_out.get_key_indexes(entry[0].name) + var row_i = indexis[1] + var col_i = indexis[0] + print('ЭМС.gd -> on_edit_entry_out', text, row_i, col_i) + + +func on_item_selected(item_num, node): + var optbtn_text = node[0].text + var indexis = $tbl_out.get_key_indexes(node[0].name) + var row_i = indexis[1] + var col_i = indexis[0] + print('ЭМС.gd -> on_item_selected row: %d col: %d text: %s' %[row_i, col_i, optbtn_text]) + + +func on_mouse_entered(btn, i, j): + $marker_in.position.y = $tbl_in.position.y + btn.position.y + btn.size.y / 2 + $marker_out.position.y = $tbl_out.position.y + (btn.size.y + 4) * i + btn.size.y / 2 + +func _process(delta): + pass diff --git a/scenes/ЭМС.tscn b/scenes/ЭМС.tscn new file mode 100644 index 0000000..7592342 --- /dev/null +++ b/scenes/ЭМС.tscn @@ -0,0 +1,102 @@ +[gd_scene load_steps=8 format=3 uid="uid://c6uls7q4e2m4h"] + +[ext_resource type="Script" path="res://scenes/ЭМС.gd" id="1_t1s35"] +[ext_resource type="Script" path="res://table/table.gd" id="2_6x8yw"] +[ext_resource type="Texture2D" uid="uid://dahjma3aqkfc0" path="res://data/эмс-указатель.png" id="3_j3w75"] +[ext_resource type="PackedScene" uid="uid://da7w3vkhadfwe" path="res://scenes/button_flat.tscn" id="4_v64lt"] +[ext_resource type="Texture2D" uid="uid://dd60btbqnpiqw" path="res://data/document-new-0.png" id="5_osu07"] +[ext_resource type="Texture2D" uid="uid://coqg6wsftvtxr" path="res://data/document-save-0.png" id="6_8684b"] +[ext_resource type="Texture2D" uid="uid://cywuevvpkxl7v" path="res://data/edit-copy-0.png" id="7_85ydm"] + +[node name="ЭМС" type="Panel"] +offset_right = 1598.0 +offset_bottom = 1201.0 +script = ExtResource("1_t1s35") + +[node name="lbl_online" type="Label" parent="."] +layout_mode = 0 +offset_left = 30.0 +offset_top = 4.0 +offset_right = 166.0 +offset_bottom = 30.0 +theme_override_colors/font_color = Color(1, 0, 0, 1) +text = "Ячейка не на связи" + +[node name="tbl_in" type="GridContainer" parent="."] +layout_mode = 0 +offset_left = 30.0 +offset_top = 46.0 +offset_right = 825.0 +offset_bottom = 182.0 +script = ExtResource("2_6x8yw") + +[node name="tbl_out" type="GridContainer" parent="."] +layout_mode = 0 +offset_left = 46.0 +offset_top = 588.0 +offset_right = 598.0 +offset_bottom = 688.0 +script = ExtResource("2_6x8yw") + +[node name="tbl_files" type="GridContainer" parent="."] +layout_mode = 0 +offset_left = 1050.0 +offset_top = 993.0 +offset_right = 1602.0 +offset_bottom = 1093.0 +script = ExtResource("2_6x8yw") + +[node name="marker_in" type="Sprite2D" parent="."] +modulate = Color(0.964706, 0.490196, 0, 1) +position = Vector2(19, 37) +texture = ExtResource("3_j3w75") + +[node name="marker_out" type="Sprite2D" parent="."] +modulate = Color(0.964706, 0.490196, 0, 1) +position = Vector2(19, 77) +texture = ExtResource("3_j3w75") + +[node name="btn_flash_read" parent="." instance=ExtResource("4_v64lt")] +layout_mode = 0 +offset_left = 1446.0 +offset_top = 55.0 +offset_right = 1583.0 +offset_bottom = 85.0 +text = "Прочитать" + +[node name="btn_flash_write" parent="." instance=ExtResource("4_v64lt")] +layout_mode = 0 +offset_left = 1446.0 +offset_top = 99.0 +offset_right = 1583.0 +offset_bottom = 129.0 +text = "Записать" + +[node name="btn_new" type="Button" parent="."] +layout_mode = 0 +offset_left = 1453.0 +offset_top = 960.0 +offset_right = 1509.0 +offset_bottom = 1016.0 +focus_mode = 0 +shortcut_feedback = false +shortcut_in_tooltip = false +icon = ExtResource("5_osu07") + +[node name="btn_save" type="Button" parent="."] +layout_mode = 0 +offset_left = 1453.0 +offset_top = 1017.0 +offset_right = 1509.0 +offset_bottom = 1073.0 +focus_mode = 0 +icon = ExtResource("6_8684b") + +[node name="btn_edit" type="Button" parent="."] +layout_mode = 0 +offset_left = 1454.0 +offset_top = 1074.0 +offset_right = 1510.0 +offset_bottom = 1130.0 +focus_mode = 0 +icon = ExtResource("7_85ydm") diff --git a/scenes/журнал.gd b/scenes/журнал.gd index d6cb83d..214a680 100644 --- a/scenes/журнал.gd +++ b/scenes/журнал.gd @@ -2,19 +2,19 @@ extends Control func _on_clear_button_down() -> void: - $content.clear() - Log.info('содержание журнала очищено оператором') + $content.clear() + Log.info('содержание журнала очищено оператором') func _on_btn_save_button_down() -> void: - $content.hide() - $btn_clear.hide() - $btn_save.hide() - $dlg_file.show() + $content.hide() + $btn_clear.hide() + $btn_save.hide() + $dlg_file.show() func _on_dlg_file_confirmed() -> void: - $content.show() - $btn_clear.show() - $btn_save.show() - $dlg_file.hide() + $content.show() + $btn_clear.show() + $btn_save.show() + $dlg_file.hide() diff --git a/scenes/кнопка-3.tscn b/scenes/кнопка-3.tscn new file mode 100644 index 0000000..df9e386 --- /dev/null +++ b/scenes/кнопка-3.tscn @@ -0,0 +1,13 @@ +[gd_scene load_steps=3 format=3 uid="uid://b37dpuas0emkc"] + +[ext_resource type="Texture2D" uid="uid://bgekehgbqyddu" path="res://кнопка-3-1.png" id="1"] +[ext_resource type="Texture2D" uid="uid://caj3qxh8fo025" path="res://кнопка-3-0.png" id="2"] + +[node name="TextureButton" type="TextureButton"] +modulate = Color(1.5, 1.5, 1.5, 1) +offset_right = 140.0 +offset_bottom = 34.0 +toggle_mode = true +action_mode = 0 +texture_normal = ExtResource("2") +texture_pressed = ExtResource("1") diff --git a/scenes/кнопка-4.tscn b/scenes/кнопка-4.tscn new file mode 100644 index 0000000..d9f0dd7 --- /dev/null +++ b/scenes/кнопка-4.tscn @@ -0,0 +1,13 @@ +[gd_scene load_steps=3 format=3 uid="uid://bsafiravyb8yf"] + +[ext_resource type="Texture2D" uid="uid://c2tdcajjqjxa0" path="res://индикатор-1-1.png" id="1"] +[ext_resource type="Texture2D" uid="uid://c0hlip7h568qk" path="res://индикатор-1-0.png" id="2"] + +[node name="indicator_1" type="TextureButton"] +modulate = Color(1, 0.596078, 0.4, 1) +offset_right = 35.0 +offset_bottom = 29.0 +toggle_mode = true +button_mask = 0 +texture_normal = ExtResource("2") +texture_pressed = ExtResource("1") diff --git a/scenes/кнопка-5.tscn b/scenes/кнопка-5.tscn new file mode 100644 index 0000000..5648d54 --- /dev/null +++ b/scenes/кнопка-5.tscn @@ -0,0 +1,3 @@ +[gd_scene format=3 uid="uid://dwcol6jg2syof"] + +[node name="OptionButton" type="OptionButton"] diff --git a/scenes/кнопка-эмс.gd b/scenes/кнопка-эмс.gd new file mode 100644 index 0000000..1e63c76 --- /dev/null +++ b/scenes/кнопка-эмс.gd @@ -0,0 +1,56 @@ +@tool + +extends PanelContainer + + +@export var texture_state0: Texture2D = preload('res://data/кнопка-эмс-1.png'): + set(val): $state.set_texture(val) + + +@export var texture_state1: Texture2D = preload('res://data/кнопка-эмс-0.png'): + set(val): $state.set_texture(val) + + +@export var text: String = '': + set(val): $button.set_text(val) + get: return $button.get_text() + + +@export var pressed: bool = false: + set(val): $button.set_pressed(val) + get: return $button.is_pressed() + + +@export var toggle_mode: bool = false: + set(val): + if is_inside_tree(): + $button.set_toggle_mode(val) + get: return $button.is_toggle_mode() + + +func set_text (val: String): $button.set_text(val) +func set_pressed (val: bool): $button.set_pressed(val) + + +func set_toggle_mode (val: bool): + if is_inside_tree(): + $button.set_toggle_mode(val) + + +func get_text(): return $button.get_text() +func is_pressed(): return $button.is_pressed() +func is_toggle_mode(): return $button.is_toggle_mode() + + +func _on_button_toggled(val: bool): + if val: $state.set_texture(texture_state1) + else: $state.set_texture(texture_state0) + + +func button_connect(button_signal: String, proc: Callable): + $button.connect(button_signal, proc) + + +func _on_button_mouse_entered(): + emit_signal("mouse_entered") + diff --git a/scenes/кнопка-эмс.tscn b/scenes/кнопка-эмс.tscn new file mode 100644 index 0000000..4f37cbe --- /dev/null +++ b/scenes/кнопка-эмс.tscn @@ -0,0 +1,51 @@ +[gd_scene load_steps=9 format=3 uid="uid://gh3wqymu7cub"] + +[ext_resource type="Script" path="res://scenes/кнопка-эмс.gd" id="1_pmsh3"] +[ext_resource type="Texture2D" uid="uid://nfpish471rjj" path="res://data/кнопка-эмс-1.png" id="2_0o537"] + +[sub_resource type="StyleBoxEmpty" id="1"] + +[sub_resource type="StyleBoxEmpty" id="6"] + +[sub_resource type="StyleBoxEmpty" id="2"] + +[sub_resource type="StyleBoxEmpty" id="3"] + +[sub_resource type="StyleBoxEmpty" id="5"] + +[sub_resource type="StyleBoxEmpty" id="4"] + +[node name="container" type="PanelContainer"] +offset_right = 30.0 +offset_bottom = 30.0 +theme_override_styles/panel = SubResource("1") +script = ExtResource("1_pmsh3") +toggle_mode = true + +[node name="state" type="NinePatchRect" parent="."] +show_behind_parent = true +layout_mode = 2 +texture = ExtResource("2_0o537") +region_rect = Rect2(-1.60803, -1.94625, 31.9305, 25.9868) +patch_margin_left = 6 +patch_margin_top = 5 +patch_margin_right = 7 +patch_margin_bottom = 5 +axis_stretch_horizontal = 2 +axis_stretch_vertical = 2 + +[node name="button" type="Button" parent="."] +layout_mode = 2 +theme_override_styles/normal = SubResource("6") +theme_override_styles/hover = SubResource("2") +theme_override_styles/pressed = SubResource("3") +theme_override_styles/disabled = SubResource("5") +theme_override_styles/focus = SubResource("4") +toggle_mode = true +clip_text = true + +[node name="label" type="Label" parent="."] +layout_mode = 2 + +[connection signal="mouse_entered" from="button" to="." method="_on_button_mouse_entered"] +[connection signal="toggled" from="button" to="." method="_on_button_toggled"] diff --git a/scenes/контроль.gd b/scenes/контроль.gd index 776bcb1..a2aee48 100644 --- a/scenes/контроль.gd +++ b/scenes/контроль.gd @@ -2,41 +2,41 @@ extends Panel const PRIBORS_RES = \ [['pribor_uf', 'res://scenes/pribor_uf.tscn'], - ['pribor_rtr', 'res://scenes/pribor_rtr.tscn'], - ['pribor_afsp_l', 'res://scenes/pribor_afsp_l.tscn'], - ['pribor_afsp_r', 'res://scenes/pribor_afsp_r.tscn'], - ['pribor_sch3', 'res://scenes/pribor_sch3.tscn'], - ['pribor_spt_l', 'res://scenes/pribor_spt_l.tscn'], - ['pribor_spt_r', 'res://scenes/pribor_spt_r.tscn'], - ['pribor_prd_v_1', 'res://scenes/pribor_prd_v_1.tscn'], - ['pribor_prd_n_1', 'res://scenes/pribor_prd_n_1.tscn'], - ['pribor_prd_k_1', 'res://scenes/pribor_prd_k_1.tscn'], - ['pribor_prd_v_2', 'res://scenes/pribor_prd_v_2.tscn'], - ['pribor_prd_n_2', 'res://scenes/pribor_prd_n_2.tscn'], - ['pribor_prd_k_2', 'res://scenes/pribor_prd_k_2.tscn'], - ['pribor_prd_v_3', 'res://scenes/pribor_prd_v_3.tscn'], - ['pribor_prd_n_3', 'res://scenes/pribor_prd_n_3.tscn'], - ['pribor_prd_k_3', 'res://scenes/pribor_prd_k_3.tscn'], - ['pribor_prd_v_4', 'res://scenes/pribor_prd_v_4.tscn'], - ['pribor_prd_n_4', 'res://scenes/pribor_prd_n_4.tscn'], - ['pribor_prd_k_4', 'res://scenes/pribor_prd_k_4.tscn']] + ['pribor_rtr', 'res://scenes/pribor_rtr.tscn'], + ['pribor_afsp_l', 'res://scenes/pribor_afsp_l.tscn'], + ['pribor_afsp_r', 'res://scenes/pribor_afsp_r.tscn'], + ['pribor_sch3', 'res://scenes/pribor_sch3.tscn'], + ['pribor_spt_l', 'res://scenes/pribor_spt_l.tscn'], + ['pribor_spt_r', 'res://scenes/pribor_spt_r.tscn'], + ['pribor_prd_v_1', 'res://scenes/pribor_prd_v_1.tscn'], + ['pribor_prd_n_1', 'res://scenes/pribor_prd_n_1.tscn'], + ['pribor_prd_k_1', 'res://scenes/pribor_prd_k_1.tscn'], + ['pribor_prd_v_2', 'res://scenes/pribor_prd_v_2.tscn'], + ['pribor_prd_n_2', 'res://scenes/pribor_prd_n_2.tscn'], + ['pribor_prd_k_2', 'res://scenes/pribor_prd_k_2.tscn'], + ['pribor_prd_v_3', 'res://scenes/pribor_prd_v_3.tscn'], + ['pribor_prd_n_3', 'res://scenes/pribor_prd_n_3.tscn'], + ['pribor_prd_k_3', 'res://scenes/pribor_prd_k_3.tscn'], + ['pribor_prd_v_4', 'res://scenes/pribor_prd_v_4.tscn'], + ['pribor_prd_n_4', 'res://scenes/pribor_prd_n_4.tscn'], + ['pribor_prd_k_4', 'res://scenes/pribor_prd_k_4.tscn']] func _ready(): - for item in PRIBORS_RES: - var pribor_node = get_node(item[0]) - var pribor_sch_path = item[1] - pribor_node.connect('button_up', Callable(self, 'on_pribor_press').bind(pribor_sch_path)) + for item in PRIBORS_RES: + var pribor_node = get_node(item[0]) + var pribor_sch_path = item[1] + pribor_node.connect('button_up', Callable(self, 'on_pribor_press').bind(pribor_sch_path)) func on_pribor_press(pribor_sch_path): - clear_obj($pribor_sch) - var pribor_sch = load(pribor_sch_path).instantiate() - $pribor_sch.add_child(pribor_sch) + clear_obj($pribor_sch) + var pribor_sch = load(pribor_sch_path).instantiate() + $pribor_sch.add_child(pribor_sch) func clear_obj(obj: Object): - var items = obj.get_children() - for item in items: - obj.remove_child(item) - item.free() + var items = obj.get_children() + for item in items: + obj.remove_child(item) + item.free() diff --git a/scenes/переключатель-эмс.tscn b/scenes/переключатель-эмс.tscn new file mode 100644 index 0000000..c2a6b61 --- /dev/null +++ b/scenes/переключатель-эмс.tscn @@ -0,0 +1,24 @@ +[gd_scene load_steps=6 format=2] + +[sub_resource type="StyleBoxEmpty" id=1] + +[sub_resource type="StyleBoxEmpty" id=2] + +[sub_resource type="StyleBoxEmpty" id=3] + +[sub_resource type="StyleBoxEmpty" id=4] + +[sub_resource type="StyleBoxEmpty" id=5] + +[node name="Node2D" type="OptionButton"] +self_modulate = Color( 1, 0.596078, 0.4, 1 ) +offset_right = 70.0 +offset_bottom = 23.0 +custom_minimum_size = Vector2( 60, 0 ) +size_flags_horizontal = 15 +size_flags_vertical = 15 +theme_override_styles/hover = SubResource( 1 ) +theme_override_styles/pressed = SubResource( 2 ) +theme_override_styles/focus = SubResource( 3 ) +theme_override_styles/disabled = SubResource( 4 ) +theme_override_styles/normal = SubResource( 5 ) diff --git a/scenes/работа.gd b/scenes/работа.gd index 844ab94..74ea742 100644 --- a/scenes/работа.gd +++ b/scenes/работа.gd @@ -55,110 +55,110 @@ signal full_screen func _ready(): - $btn_strobe.button_connect('pressed', Callable(self, 'on_button_strobe_pressed')) - $btn_off.set_pressed(true) - strob_center = $canvas.get_strob_center() - on_button_strobe_pressed() - drag_fsm = DRAG_FSM.OFF - var nodes: = get_tree().get_nodes_in_group('группа-режим-помехи') - for btn in nodes: - btn.button_connect('pressed', Callable(self, 'on_button_pressed').bind(btn, nodes)) + $btn_strobe.button_connect('pressed', Callable(self, 'on_button_strobe_pressed')) + $btn_off.set_pressed(true) + strob_center = $canvas.get_strob_center() + on_button_strobe_pressed() + drag_fsm = DRAG_FSM.OFF + var nodes: = get_tree().get_nodes_in_group('группа-режим-помехи') + for btn in nodes: + btn.button_connect('pressed', Callable(self, 'on_button_pressed').bind(btn, nodes)) func on_button_strobe_pressed(): - if $btn_strobe.is_pressed(): - $canvas.set_strob_visible(true) - drag_fsm = DRAG_FSM.IDLE - else: - $canvas.set_strob_visible(false) - drag_fsm = DRAG_FSM.OFF + if $btn_strobe.is_pressed(): + $canvas.set_strob_visible(true) + drag_fsm = DRAG_FSM.IDLE + else: + $canvas.set_strob_visible(false) + drag_fsm = DRAG_FSM.OFF func on_button_pressed(btn_this, btn_others): - # поведение радиокнопок в группе - for btn_other in btn_others: - btn_other.set_pressed(btn_this == btn_other) + # поведение радиокнопок в группе + for btn_other in btn_others: + btn_other.set_pressed(btn_this == btn_other) func clip_value(val, val_min, val_max): - if val < val_min: val = val_min - if val > val_max: val = val_max - return val + if val < val_min: val = val_min + if val > val_max: val = val_max + return val func get_strob_width(pos: Vector2, prev: float) -> float: - var strob_dir_width: float = prev + (drag_pos_begin.y - pos.y) * drag_scale_width - strob_dir_width = clip_value(strob_dir_width, strob_min_width, strob_max_width) - return strob_dir_width + var strob_dir_width: float = prev + (drag_pos_begin.y - pos.y) * drag_scale_width + strob_dir_width = clip_value(strob_dir_width, strob_min_width, strob_max_width) + return strob_dir_width func get_strob_band(pos: Vector2, prev: float) -> float: - var strob_dir_band: float = prev - (drag_pos_begin.y - pos.y) * drag_scale_band - strob_dir_band = clip_value(strob_dir_band, strob_min_band, strob_max_band) - return strob_dir_band + var strob_dir_band: float = prev - (drag_pos_begin.y - pos.y) * drag_scale_band + strob_dir_band = clip_value(strob_dir_band, strob_min_band, strob_max_band) + return strob_dir_band func set_strob(pos: Vector2): - var radp: Vector2 = Tools.map_dec_to_rad(strob_center, pos) - if radp.y < $canvas.get_radius_max(): - $canvas.set_strob_dir(radp.x) - $canvas.set_strob_radius(radp.y) + var radp: Vector2 = Tools.map_dec_to_rad(strob_center, pos) + if radp.y < $canvas.get_radius_max(): + $canvas.set_strob_dir(radp.x) + $canvas.set_strob_radius(radp.y) func _on_drag_continue(event): - if drag_button == MOUSE_BUTTON_RIGHT: - if shift_pressed: - var strob_width: float = get_strob_width(event.position, strob_width_begin) - $canvas.set_strob_width(strob_width) - else: - var strob_band: float = get_strob_band(event.position, strob_band_begin) - $canvas.set_strob_band(strob_band) - elif drag_button == MOUSE_BUTTON_LEFT: - set_strob(event.position) + if drag_button == MOUSE_BUTTON_RIGHT: + if shift_pressed: + var strob_width: float = get_strob_width(event.position, strob_width_begin) + $canvas.set_strob_width(strob_width) + else: + var strob_band: float = get_strob_band(event.position, strob_band_begin) + $canvas.set_strob_band(strob_band) + elif drag_button == MOUSE_BUTTON_LEFT: + set_strob(event.position) func _on_drag_begin(event): - drag_pos_begin = event.position - if drag_button == MOUSE_BUTTON_LEFT: - set_strob(event.position) - elif drag_button == MOUSE_BUTTON_RIGHT: - strob_width_begin = $canvas.get_strob_width() - strob_band_begin = $canvas.get_strob_band() + drag_pos_begin = event.position + if drag_button == MOUSE_BUTTON_LEFT: + set_strob(event.position) + elif drag_button == MOUSE_BUTTON_RIGHT: + strob_width_begin = $canvas.get_strob_width() + strob_band_begin = $canvas.get_strob_band() func _input(event): - if event is InputEventMouseMotion: - if drag_fsm == DRAG_FSM.DRAG: - emit_signal('drag_continue', event) - elif event is InputEventMouseButton: - drag_button = event.button_index - if event.pressed: - if drag_fsm == DRAG_FSM.IDLE: - drag_fsm = DRAG_FSM.DRAG - emit_signal('drag_begin', event) - else: - drag_fsm = DRAG_FSM.IDLE - emit_signal('drag_end', event) - elif event is InputEventKey: - if event.pressed and event.physical_keycode == KEY_F11: - emit_signal('full_screen') - elif event.physical_keycode == KEY_SHIFT: - shift_pressed = event.pressed + if event is InputEventMouseMotion: + if drag_fsm == DRAG_FSM.DRAG: + emit_signal('drag_continue', event) + elif event is InputEventMouseButton: + drag_button = event.button_index + if event.pressed: + if drag_fsm == DRAG_FSM.IDLE: + drag_fsm = DRAG_FSM.DRAG + emit_signal('drag_begin', event) + else: + drag_fsm = DRAG_FSM.IDLE + emit_signal('drag_end', event) + elif event is InputEventKey: + if event.pressed and event.physical_keycode == KEY_F11: + emit_signal('full_screen') + elif event.physical_keycode == KEY_SHIFT: + shift_pressed = event.pressed func toggle_full_screen(id: int): - var mode = DisplayServer.window_get_mode(id) - if mode == DisplayServer.WINDOW_MODE_FULLSCREEN: - mode = DisplayServer.WINDOW_MODE_WINDOWED - else: - mode = DisplayServer.WINDOW_MODE_FULLSCREEN - DisplayServer.window_set_mode(mode, id) + var mode = DisplayServer.window_get_mode(id) + if mode == DisplayServer.WINDOW_MODE_FULLSCREEN: + mode = DisplayServer.WINDOW_MODE_WINDOWED + else: + mode = DisplayServer.WINDOW_MODE_FULLSCREEN + DisplayServer.window_set_mode(mode, id) func _on_full_screen(): - toggle_full_screen(window_1_id) - toggle_full_screen(window_0_id) + toggle_full_screen(window_1_id) + toggle_full_screen(window_0_id) func _on_btn_down(signal_name: String) -> void: - emit_signal(signal_name) + emit_signal(signal_name) diff --git a/scenes/рамка.gd b/scenes/рамка.gd index 0bb06c2..1801b46 100644 --- a/scenes/рамка.gd +++ b/scenes/рамка.gd @@ -4,15 +4,15 @@ extends NinePatchRect @export var horizontal_alignment: HorizontalAlignment = HorizontalAlignment.HORIZONTAL_ALIGNMENT_CENTER: - get: return $header.horizontal_alignment - set(val): $header.horizontal_alignment = val + get: return $header.horizontal_alignment + set(val): $header.horizontal_alignment = val @export var vertical_alignment: VerticalAlignment = VerticalAlignment.VERTICAL_ALIGNMENT_CENTER: - get: return $header.vertical_alignment - set(val): $header.vertical_alignment = val + get: return $header.vertical_alignment + set(val): $header.vertical_alignment = val @export var text: String = 'caption text': - get: return $header.text - set(val): $header.text = val + get: return $header.text + set(val): $header.text = val diff --git a/scenes/состояния-эмс.gd b/scenes/состояния-эмс.gd new file mode 100644 index 0000000..dae63dc --- /dev/null +++ b/scenes/состояния-эмс.gd @@ -0,0 +1,5 @@ +extends Control +var align : get = get_align, set = set_align +var _align: int = 0 +func set_align(align: int): _align = align +func get_align(): return _align diff --git a/scenes/состояния-эмс.tscn b/scenes/состояния-эмс.tscn new file mode 100644 index 0000000..e9def59 --- /dev/null +++ b/scenes/состояния-эмс.tscn @@ -0,0 +1,40 @@ +[gd_scene load_steps=7 format=3 uid="uid://by22sta8tt8dn"] + +[ext_resource type="Texture2D" uid="uid://belwchvdktrw0" path="res://data/эмс-бланк.png" id="1_0wisd"] +[ext_resource type="Script" path="res://scenes/состояния-эмс.gd" id="1_vw38j"] +[ext_resource type="Texture2D" uid="uid://bwddxs24es81u" path="res://data/эмс-бланк-пост.png" id="2_nbah5"] +[ext_resource type="Texture2D" uid="uid://pfoscstbm025" path="res://data/эмс-бланк-перем.png" id="3_vsgfs"] +[ext_resource type="Texture2D" uid="uid://dvl3sq036gn75" path="res://data/эмс-бланк-замыкание.png" id="4_qu3c5"] + +[sub_resource type="SpriteFrames" id="SpriteFrames_ow7xh"] +animations = [{ +"frames": [{ +"duration": 1.0, +"texture": ExtResource("1_0wisd") +}, { +"duration": 1.0, +"texture": ExtResource("2_nbah5") +}, { +"duration": 1.0, +"texture": ExtResource("3_vsgfs") +}, { +"duration": 1.0, +"texture": ExtResource("4_qu3c5") +}], +"loop": true, +"name": &"default", +"speed": 5.0 +}] + +[node name="Control" type="Control"] +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +script = ExtResource("1_vw38j") + +[node name="sprite" type="AnimatedSprite2D" parent="."] +position = Vector2(14, 9) +sprite_frames = SubResource("SpriteFrames_ow7xh") diff --git a/scenes/ячейка-1.tscn b/scenes/ячейка-1.tscn new file mode 100644 index 0000000..a396324 --- /dev/null +++ b/scenes/ячейка-1.tscn @@ -0,0 +1,7 @@ +[gd_scene format=3 uid="uid://dqcfr20vovhq5"] + +[node name="Label" type="Label"] +offset_right = 122.0 +offset_bottom = 34.0 +theme_override_colors/font_color = Color(1, 0.596078, 0.4, 1) +clip_text = true diff --git a/scenes/ячейка-2.tscn b/scenes/ячейка-2.tscn new file mode 100644 index 0000000..0bd9fe8 --- /dev/null +++ b/scenes/ячейка-2.tscn @@ -0,0 +1,11 @@ +[gd_scene format=3 uid="uid://dspa16ufrpanp"] + +[node name="LineEdit" type="LineEdit"] +offset_right = 58.0 +offset_bottom = 33.0 +theme_override_colors/font_color = Color(1, 0.596078, 0.4, 1) +context_menu_enabled = false +shortcut_keys_enabled = false +middle_mouse_paste_enabled = false +caret_blink = true +caret_blink_interval = 0.13 diff --git a/scripts/repsettings.gd b/scripts/repsettings.gd index 7c4db0a..c2780f3 100644 --- a/scripts/repsettings.gd +++ b/scripts/repsettings.gd @@ -1,21 +1,21 @@ extends Node @export var addr: Dictionary = { \ - 'уарэп-яу07-частный': ['udp', '10.1.1.160', 50160, 'IP-адрес ЯУ-07 прибора УФ'], - 'уарэп-яу07-общий': ['udp', '10.1.1.255', 50000, 'IP-адрес для приёма широковещательных пакетов от ЯУ-07'], - 'уарэп-капсрпб-пол': ['udp', 'localhost', 42023, 'IP-адрес получения сообщений от КАПС РПБ'], - 'уарэп-капсрпб-отп': ['udp', 'localhost', 42022, 'IP-адрес отправки сообщений на КАПС РПБ'], - 'уарэп-эмс': ['yau07', '10.1.1.27', 50027, 'IP-адрес ЯУ-07 прибора УФ'], - 'уарэп-яу07-2в': ['yau07', '10.1.1.34', 50034, 'IP-адрес ЯУ-07 прибора ПРД-В'], - 'уарэп-яу07-2н': ['yau07', '10.1.1.33', 50033, 'IP-адрес ЯУ-07 прибора ПРД-Н'], - 'уарэп-яу07-2к': ['yau07', '10.1.1.35', 50035, 'IP-адрес ЯУ-07 прибора ПРД-К'], - 'уарэп-яу07-4в': ['yau07', '10.1.1.66', 50066, 'IP-адрес ЯУ-07 прибора ПРД-В'], - 'уарэп-яу07-4н': ['yau07', '10.1.1.65', 50065, 'IP-адрес ЯУ-07 прибора ПРД-Н'], - 'уарэп-яу07-4к': ['yau07', '10.1.1.67', 50067, 'IP-адрес ЯУ-07 прибора ПРД-К'], - 'уарэп-яу07-1в': ['yau07', '10.1.1.18', 50018, 'IP-адрес ЯУ-07 прибора ПРД-В'], - 'уарэп-яу07-1н': ['yau07', '10.1.1.17', 50017, 'IP-адрес ЯУ-07 прибора ПРД-Н'], - 'уарэп-яу07-1к': ['yau07', '10.1.1.19', 50019, 'IP-адрес ЯУ-07 прибора ПРД-К'], - 'уарэп-яу07-3в': ['yau07', '10.1.1.50', 50050, 'IP-адрес ЯУ-07 прибора ПРД-В'], - 'уарэп-яу07-3н': ['yau07', '10.1.1.49', 50049, 'IP-адрес ЯУ-07 прибора ПРД-Н'], - 'уарэп-яу07-3к': ['yau07', '10.1.1.51', 50051, 'IP-адрес ЯУ-07 прибора ПРД-Н'], - 'уарэп-щ3': ['uart', '/dev/stty0', 115200, 1, 1, false, 1000, 'Прибор Щ3 (скорость, стартовых, стоповых, чётность, таймаут в мкс)'] } + 'уарэп-яу07-частный': ['udp', '10.1.1.160', 50160, 'IP-адрес ЯУ-07 прибора УФ'], + 'уарэп-яу07-общий': ['udp', '10.1.1.255', 50000, 'IP-адрес для приёма широковещательных пакетов от ЯУ-07'], + 'уарэп-капсрпб-пол': ['udp', 'localhost', 42023, 'IP-адрес получения сообщений от КАПС РПБ'], + 'уарэп-капсрпб-отп': ['udp', 'localhost', 42022, 'IP-адрес отправки сообщений на КАПС РПБ'], + 'уарэп-эмс': ['yau07', '10.1.1.27', 50027, 'IP-адрес ЯУ-07 прибора УФ'], + 'уарэп-яу07-2в': ['yau07', '10.1.1.34', 50034, 'IP-адрес ЯУ-07 прибора ПРД-В'], + 'уарэп-яу07-2н': ['yau07', '10.1.1.33', 50033, 'IP-адрес ЯУ-07 прибора ПРД-Н'], + 'уарэп-яу07-2к': ['yau07', '10.1.1.35', 50035, 'IP-адрес ЯУ-07 прибора ПРД-К'], + 'уарэп-яу07-4в': ['yau07', '10.1.1.66', 50066, 'IP-адрес ЯУ-07 прибора ПРД-В'], + 'уарэп-яу07-4н': ['yau07', '10.1.1.65', 50065, 'IP-адрес ЯУ-07 прибора ПРД-Н'], + 'уарэп-яу07-4к': ['yau07', '10.1.1.67', 50067, 'IP-адрес ЯУ-07 прибора ПРД-К'], + 'уарэп-яу07-1в': ['yau07', '10.1.1.18', 50018, 'IP-адрес ЯУ-07 прибора ПРД-В'], + 'уарэп-яу07-1н': ['yau07', '10.1.1.17', 50017, 'IP-адрес ЯУ-07 прибора ПРД-Н'], + 'уарэп-яу07-1к': ['yau07', '10.1.1.19', 50019, 'IP-адрес ЯУ-07 прибора ПРД-К'], + 'уарэп-яу07-3в': ['yau07', '10.1.1.50', 50050, 'IP-адрес ЯУ-07 прибора ПРД-В'], + 'уарэп-яу07-3н': ['yau07', '10.1.1.49', 50049, 'IP-адрес ЯУ-07 прибора ПРД-Н'], + 'уарэп-яу07-3к': ['yau07', '10.1.1.51', 50051, 'IP-адрес ЯУ-07 прибора ПРД-Н'], + 'уарэп-щ3': ['uart', '/dev/stty0', 115200, 1, 1, false, 1000, 'Прибор Щ3 (скорость, стартовых, стоповых, чётность, таймаут в мкс)'] } diff --git a/scripts/threats.gd b/scripts/threats.gd index 355c5d8..209db54 100644 --- a/scripts/threats.gd +++ b/scripts/threats.gd @@ -3,27 +3,27 @@ extends Node class Threat: - enum FFlags { # Допустимые значения для Threat.fflags - NONE = 0, TMOD = 1, BAUD = 2, PROTO = 4, - SLON = 8, SLAT = 16, SALT = 32, LAT = 64, - LON = 128, ALT = 256 } + enum FFlags { # Допустимые значения для Threat.fflags + NONE = 0, TMOD = 1, BAUD = 2, PROTO = 4, + SLON = 8, SLAT = 16, SALT = 32, LAT = 64, + LON = 128, ALT = 256 } - var id: int # Идентификатор цели - var aoa: float # Курсовой угол на источник сигнала, градусы. - var freq: float # Частота несущей или центральная частота, МГц - var width: float # Ширина занимаемого диапазона частот, МГц - var pow_rx: float # Уровень принимаемого сигнала, дБм - var tick: int # Уровень принимаемого сигнала, дБм - var freqm: String # Режим смены частоты - var rkrp: String # Рекомендуемый режим помехи - var rparams: String # Рекомендуемые параметры помехи - var tmod: String # Тип модуляции - var baud: float # Модуляционная скорость - var proto: String # Тип протокола источника сигнала - var slon: float # Координаты старта, долгота в градусах. Достоверность задана значением Threat.fflags - var slat: float # Координаты старта, широта в градусах. Достоверность задана значением Threat.fflags - var salt: float # Координаты старта, высота от уровня моря. метры. Достоверность задана значением Threat.fflags - var lat: float # Текущие координаты, долгота в градусах. Достоверность задана значением Threat.fflags - var lon: float # Текущие координаты, широта в градусах. Достоверность задана значением Threat.fflags - var alt: float # Текущая высота, метры. Достоверность задана значением Threat.fflags - var fflags: FFlags # Флаги достоверности полей + var id: int # Идентификатор цели + var aoa: float # Курсовой угол на источник сигнала, градусы. + var freq: float # Частота несущей или центральная частота, МГц + var width: float # Ширина занимаемого диапазона частот, МГц + var pow_rx: float # Уровень принимаемого сигнала, дБм + var tick: int # Уровень принимаемого сигнала, дБм + var freqm: String # Режим смены частоты + var rkrp: String # Рекомендуемый режим помехи + var rparams: String # Рекомендуемые параметры помехи + var tmod: String # Тип модуляции + var baud: float # Модуляционная скорость + var proto: String # Тип протокола источника сигнала + var slon: float # Координаты старта, долгота в градусах. Достоверность задана значением Threat.fflags + var slat: float # Координаты старта, широта в градусах. Достоверность задана значением Threat.fflags + var salt: float # Координаты старта, высота от уровня моря. метры. Достоверность задана значением Threat.fflags + var lat: float # Текущие координаты, долгота в градусах. Достоверность задана значением Threat.fflags + var lon: float # Текущие координаты, широта в градусах. Достоверность задана значением Threat.fflags + var alt: float # Текущая высота, метры. Достоверность задана значением Threat.fflags + var fflags: FFlags # Флаги достоверности полей diff --git a/scripts/tools.gd b/scripts/tools.gd index bf9720a..0f7019e 100644 --- a/scripts/tools.gd +++ b/scripts/tools.gd @@ -2,59 +2,59 @@ extends Node func map_dec_to_rad(pos0: Vector2, pos: Vector2) -> Vector2: - """ Преобразует декартовые координаты в полярные """ - var x1: float = pos.x - pos0.x - var y1: float = pos.y - pos0.y - var ang: float = (atan2(y1, x1) * 180.0) / PI - ang += 360.0 * float(ang < 0.0) - var radius: float = hypot(x1, y1) - return Vector2(ang, radius) + """ Преобразует декартовые координаты в полярные """ + var x1: float = pos.x - pos0.x + var y1: float = pos.y - pos0.y + var ang: float = (atan2(y1, x1) * 180.0) / PI + ang += 360.0 * float(ang < 0.0) + var radius: float = hypot(x1, y1) + return Vector2(ang, radius) func hypot(x: float, y: float) -> float: - return sqrt(x * x + y * y) + return sqrt(x * x + y * y) func is_overlap(x1, x2, y1, y2): - """ Проверяет пересечение диапазона x1, x2 с диапазоном y1, y2 """ - return max(x1, y1) <= min(x2, y2) + """ Проверяет пересечение диапазона x1, x2 с диапазоном y1, y2 """ + return max(x1, y1) <= min(x2, y2) func ibytes_to_word(buf: PackedByteArray, i: int) -> int: - return buf[i] + (buf[i + 1] * 256) + return buf[i] + (buf[i + 1] * 256) func map_range(val: float, a0: float, a1: float, b0: float, b1: float) -> float: - """ Переводит значение val из диапазона a0...a1 в диапазон b0...b1 """ - return (((val - a0) * (b1 - b0)) / (a1 - a0)) + b0 + """ Переводит значение val из диапазона a0...a1 в диапазон b0...b1 """ + return (((val - a0) * (b1 - b0)) / (a1 - a0)) + b0 func type_is_num(val) -> bool: - """ Возвращает true, если val число, false - если иначе """ - return (typeof(val) == TYPE_INT) or (typeof(val) == typeof(0.0)) + """ Возвращает true, если val число, false - если иначе """ + return (typeof(val) == TYPE_INT) or (typeof(val) == typeof(0.0)) func sort_ascending_0(a, b) -> bool: - return a[0] < b[0] + return a[0] < b[0] func is_point_in_polygon(pos: Vector2, p: PackedVector2Array) -> bool: - var j: int = len(p) - 1 - var odd_nodes: int = 0 - for i in range(len(p)): - if ((p[i].y < pos.y and p[j].y >= pos.y or p[j].y < pos.y and p[i].y >= pos.y) and (p[i].x <= pos.x or p[j].x <= pos.x)): - odd_nodes ^= int((p[i].x + (pos.y - p[i].y) / (p[j].y - p[i].y) * (p[j].x - p[i].x) < pos.x)) - j = i - return odd_nodes > 0 + var j: int = len(p) - 1 + var odd_nodes: int = 0 + for i in range(len(p)): + if ((p[i].y < pos.y and p[j].y >= pos.y or p[j].y < pos.y and p[i].y >= pos.y) and (p[i].x <= pos.x or p[j].x <= pos.x)): + odd_nodes ^= int((p[i].x + (pos.y - p[i].y) / (p[j].y - p[i].y) * (p[j].x - p[i].x) < pos.x)) + j = i + return odd_nodes > 0 func set_wordi(buf: Array, index, val): - """ - Устанавливает слово в байтовом массиве - :param buf: Байтовый массив - :param index: Индекс младшего байта слова в массиве - :param val: Значение слова для записи в батовый массив - :return: None """ - buf[index] = val & 0xff - buf[index + 1] = (val >> 8) & 0xff + """ + Устанавливает слово в байтовом массиве + :param buf: Байтовый массив + :param index: Индекс младшего байта слова в массиве + :param val: Значение слова для записи в батовый массив + :return: None """ + buf[index] = val & 0xff + buf[index + 1] = (val >> 8) & 0xff diff --git a/scripts/yems_devs.gd b/scripts/yems_devs.gd new file mode 100644 index 0000000..8e7e5ec --- /dev/null +++ b/scripts/yems_devs.gd @@ -0,0 +1,44 @@ +extends Node + + +class InDev: + var id: int # Идентификатор индекс устройства + var dev_name: String # Имя подключаемого комплекса + var connector: String # Номер разъёма в приборе + var delay: float # Задержка фронта импульса + var offset: float # Смещение фронта импульса + var state: int # Состояние входа + var freq: int # Предполагаемая частота на которой работает комплекс + var ports_data: Dictionary # Словарь состояния портов устройства + var tbl_row_id: int # Индекс устройства в таблице входов + var out_dots: Array # Список выходных устройств в порядке, как в таблице и точки матрицы + + func _init(dev_id : int, params : Array, row_id : int): + id = dev_id + dev_name = String(params[0]) + connector = String(params[1]) + delay = float(params[2]) + offset = float(params[3]) + tbl_row_id = row_id + + +class OutDev: + var id: int # Идентификатор индекс устройства + var dev_name: String # Имя подключаемого комплекса + var connector: String # Номер разъёма в приборе + var delay: float # Задержка фронта импульса + var offset: float # Смещение фронта импульса + var state: int # Состояние входа + var freq: int # Предполагаемая частота на которой работает комплекс + var ports_data: Dictionary # Словарь состояния портов устройства + var tbl_row_id: int # Индекс устройства в таблице выходов + var mode: int # Режим работы выхода + + func _init(dev_id : int, params : Array, row_id : int): + id = dev_id + dev_name = String(params[0]) + connector = String(params[1]) + delay = float(params[2]) + offset = float(params[3]) + tbl_row_id = row_id + mode = 0 diff --git a/table/table.gd b/table/table.gd index ec13200..105eb27 100644 --- a/table/table.gd +++ b/table/table.gd @@ -34,506 +34,505 @@ signal selected_changed(i_row: int) # Вызывается при измене func selector_up(): - var i_rows: = [] - get_selected_rows(i_rows) - for i in i_rows: - set_row_selected(i, false) - var rows_count: = get_rows_count() - if not (i_rows.size() and (rows_count > 1)): - return - var i_row = i_rows[0] - i_row -= 1 - if i_row < 0: - i_row = rows_count - 1 - set_row_selected(i_row, true) - emit_signal('selected_changed', i_row) + var i_rows: = [] + get_selected_rows(i_rows) + for i in i_rows: + set_row_selected(i, false) + var rows_count: = get_rows_count() + if not (i_rows.size() and (rows_count > 1)): + return + var i_row = i_rows[0] + i_row -= 1 + if i_row < 0: + i_row = rows_count - 1 + set_row_selected(i_row, true) + emit_signal('selected_changed', i_row) func selector_down(): - var i_rows: = [] - get_selected_rows(i_rows) - for i in i_rows: - set_row_selected(i, false) - var rows_count: = get_rows_count() - if not (i_rows.size() and (rows_count > 1)): - return - var i_row = i_rows[0] - i_row += 1 - i_row %= rows_count - set_row_selected(i_row, true) - emit_signal('selected_changed', i_row) + var i_rows: = [] + get_selected_rows(i_rows) + for i in i_rows: + set_row_selected(i, false) + var rows_count: = get_rows_count() + if not (i_rows.size() and (rows_count > 1)): + return + var i_row = i_rows[0] + i_row += 1 + i_row %= rows_count + set_row_selected(i_row, true) + emit_signal('selected_changed', i_row) func set_columns_alignments(alignments): - assert(columns == alignments.size()) - var rows_count: = get_rows_count() - for i_row in rows_count: - for i_col in alignments.size(): - set_node_alligment(i_col, i_row, alignments[i_col]) + assert(columns == alignments.size()) + var rows_count: = get_rows_count() + for i_row in rows_count: + for i_col in alignments.size(): + set_node_alligment(i_col, i_row, alignments[i_col]) func load_selector_scene(file_name: String): - selector_type_file = file_name - ScnSelector = load(file_name) + selector_type_file = file_name + ScnSelector = load(file_name) func load_node_scene(file_name: String): - node_type_file = file_name - ScnNode = load(file_name) + node_type_file = file_name + ScnNode = load(file_name) func get_node_scene(): - return node_type_file + return node_type_file func _ready(): - ScnSelector = load(selector_type_file) - ScnNode = load(node_type_file) - assert(ScnSelector) - assert(ScnNode) + ScnSelector = load(selector_type_file) + ScnNode = load(node_type_file) + assert(ScnSelector) + assert(ScnNode) func align_to_left_bottom(header, gap: = Vector2(0, 0)): - """ Выравнивает по нижнему левому углу. - Используется для выравнивания по заголовку """ - position.x = header.position.x + gap.x - position.y = header.position.y + header.size.y + gap.y + """ Выравнивает по нижнему левому углу. + Используется для выравнивания по заголовку """ + position.x = header.position.x + gap.x + position.y = header.position.y + header.size.y + gap.y func _assert_meta(i_col: int, i_row: int, pname: String, node): - assert(node.has_meta(pname), 'ошибка: нет мета-свойства \"%s\" у ячейки (%s): колонка:%d ряд:%d' % [pname, typeof(node), i_col, i_row]) + assert(node.has_meta(pname), 'ошибка: нет мета-свойства \"%s\" у ячейки (%s): колонка:%d ряд:%d' % [pname, typeof(node), i_col, i_row]) func set_node_meta(i_col: int, i_row: int, pname: String, val) -> void: - var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row) - var node = nodes[key] - node.set_meta(pname, val) + var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row) + var node = nodes[key] + node.set_meta(pname, val) func get_node_meta(i_col: int, i_row: int, pname: String): - var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row) - var node = nodes[key] - _assert_meta(i_col, i_row, pname, node) - return node.get_meta(pname) + var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row) + var node = nodes[key] + _assert_meta(i_col, i_row, pname, node) + return node.get_meta(pname) func set_node_property(i_col: int, i_row: int, pname: String, val) -> void: - var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row) - var node = nodes[key] - node.set(pname, val) + var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row) + var node = nodes[key] + node.set(pname, val) func get_node_property(i_col: int, i_row: int, pname: String): - var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row) - var node = nodes[key] - return node.get(pname) + var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row) + var node = nodes[key] + return node.get(pname) func get_node_key(format: String, i_col: int, i_row: int) -> String: - var key: String = format % [i_row, i_col] - assert(nodes.has(key), 'ошибка: нет такой ячейки: колонка:%d ряд:%d' % [i_col, i_row]) - return key + var key: String = format % [i_row, i_col] + assert(nodes.has(key), 'ошибка: нет такой ячейки: колонка:%d ряд:%d' % [i_col, i_row]) + return key func get_key_indexes(key: String) -> Array: - var tokens: = key.split('_') - assert(tokens.size() == 3, 'ошибка: неверный ключ: \"%s\"' % key) - return [int(tokens[2]), int(tokens[1])] + var tokens: = key.split('_') + assert(tokens.size() == 3, 'ошибка: неверный ключ: \"%s\"' % key) + return [int(tokens[2]), int(tokens[1])] func set_columns_min_size(sizes: Array) -> void: - var rows_count: = get_rows_count() - for i_row in rows_count: - set_nodes_min_size(i_row, sizes) - set_nodes_min_size(0, sizes, HEAD_KEY_FORMAT) + var rows_count: = get_rows_count() + for i_row in rows_count: + set_nodes_min_size(i_row, sizes) + set_nodes_min_size(0, sizes, HEAD_KEY_FORMAT) func set_columns_aligment(alignments: Array) -> void: - var rows_count: = get_rows_count() - for i_row in rows_count: - for i_col in alignments.size(): - set_node_alligment(i_col, i_row, alignments[i_col]) + var rows_count: = get_rows_count() + for i_row in rows_count: + for i_col in alignments.size(): + set_node_alligment(i_col, i_row, alignments[i_col]) func _input(event) -> void: - if event is InputEventKey: - if in_focus and event.pressed: - if event.keycode == selector_key_up: - selector_up() - elif event.keycode == selector_key_down: - selector_down() - elif event is InputEventMouseButton: - if not event.pressed: - return - if (event.position.x < position.x) \ - or (event.position.x > (position.x + size.x)) \ - or (event.position.y < position.y) \ - or (event.position.y > (position.y + size.y)): - in_focus = false - emit_signal('focus_exited') - return - var rows_count: = get_rows_count() - in_focus = true - emit_signal('focus_entered') - for i_row in rows_count: - var rect = [0, 0, 0, 0] - get_node_rect(0, i_row, rect) - var y = rect[1] + position.y - if event.position.y < y: - continue - if event.position.y > (y + rect[3]): - continue - emit_signal('row_pressed', i_row) - break + if event is InputEventKey: + if in_focus and event.pressed: + if event.keycode == selector_key_up: + selector_up() + elif event.keycode == selector_key_down: + selector_down() + elif event is InputEventMouseButton: + if not event.pressed: + return + if (event.position.x < position.x) \ + or (event.position.x > (position.x + size.x)) \ + or (event.position.y < position.y) \ + or (event.position.y > (position.y + size.y)): + in_focus = false + emit_signal('focus_exited') + return + var rows_count: = get_rows_count() + in_focus = true + emit_signal('focus_entered') + for i_row in rows_count: + var rect = [0, 0, 0, 0] + get_node_rect(0, i_row, rect) + var y = rect[1] + position.y + if event.position.y < y: + continue + if event.position.y > (y + rect[3]): + continue + emit_signal('row_pressed', i_row) + break func _init() -> void: - selector_color_proc = Callable(self, 'defaultselector_color_proc') - assert(selector_color_proc.is_valid()) - selector_size_proc = Callable(self, 'default_selector_size_proc') - assert(selector_size_proc.is_valid()) + selector_color_proc = Callable(self, 'defaultselector_color_proc') + assert(selector_color_proc.is_valid()) + selector_size_proc = Callable(self, 'default_selector_size_proc') + assert(selector_size_proc.is_valid()) func defaultselector_color_proc(_i_row: int): - return selector_color + return selector_color func setselector_color_proc(instance: Object, function: String) -> void: - selector_color_proc = Callable(instance, function) - assert(selector_color_proc.is_valid()) + selector_color_proc = Callable(instance, function) + assert(selector_color_proc.is_valid()) func set_selector_size_proc(instance: Object, function: String) -> void: - selector_size_proc = Callable(instance, function) - assert(selector_size_proc.is_valid()) + selector_size_proc = Callable(instance, function) + assert(selector_size_proc.is_valid()) func default_selector_size_proc(i_row: int, rect: Array) -> void: - get_row_rect(i_row, rect) - rect[0] = rect[0] + position.x - node_gap.x / 2.0 - rect[1] = rect[1] + position.y - node_gap.y / 2.0 - rect[2] = rect[2] + node_gap.x - rect[3] = rect[3] + node_gap.y + get_row_rect(i_row, rect) + rect[0] = rect[0] + position.x - node_gap.x / 2.0 + rect[1] = rect[1] + position.y - node_gap.y / 2.0 + rect[2] = rect[2] + node_gap.x + rect[3] = rect[3] + node_gap.y func clear_rows_selected(): - var rows_count: = get_rows_count() - for i_row in rows_count: - set_row_selected(i_row, false) + var rows_count: = get_rows_count() + for i_row in rows_count: + set_row_selected(i_row, false) func set_row_selected(i_row: int, selected: bool = true) -> void: - var key: = ROW_SELECTOR_KEY_FORMAT % [i_row, 0] - var parent = get_parent() - if nodes.has(key) and (not selected): - var selector = nodes[key] - parent.remove_child(selector) - selector.queue_free() - nodes.erase(key) - elif (not nodes.has(key)) and selected: - var selector = ScnSelector.instantiate() - var rect: = [0, 0, 0, 0] - selector_size_proc.call(i_row, rect) - selector.position.x = rect[0] - selector.position.y = rect[1] - selector.size.x = rect[2] - selector.size.y = rect[3] - selector.modulate = selector_color_proc.call(i_row) - nodes[key] = selector - parent.add_child(selector) + var key: = ROW_SELECTOR_KEY_FORMAT % [i_row, 0] + var parent = get_parent() + if nodes.has(key) and (not selected): + var selector = nodes[key] + parent.remove_child(selector) + selector.queue_free() + nodes.erase(key) + elif (not nodes.has(key)) and selected: + var selector = ScnSelector.instantiate() + var rect: = [0, 0, 0, 0] + selector_size_proc.call(i_row, rect) + selector.position.x = rect[0] + selector.position.y = rect[1] + selector.size.x = rect[2] + selector.size.y = rect[3] + selector.modulate = selector_color_proc.call(i_row) + nodes[key] = selector + parent.add_child(selector) func is_row_selected(i_row: int) -> bool: - var key: = get_node_key(ROW_SELECTOR_KEY_FORMAT, 0, i_row) - return nodes.has(key) + var key: = get_node_key(ROW_SELECTOR_KEY_FORMAT, 0, i_row) + return nodes.has(key) func get_selected_rows(rows: Array) -> void: - for key in nodes.keys(): - if SLCT_PREFIX in key: - var indexes = get_key_indexes(key) - rows.append(indexes[1]) + for key in nodes.keys(): + if SLCT_PREFIX in key: + var indexes = get_key_indexes(key) + rows.append(indexes[1]) func get_rows_count() -> int: - var rows_count: int = 0 - for key in nodes: - rows_count += int(NODE_PREFIX in key) - return rows_count / columns + var rows_count: int = 0 + for key in nodes: + rows_count += int(NODE_PREFIX in key) + return rows_count / columns func get_node2(i_col: int, i_row: int) -> Node: - var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row) - return nodes[key] + var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row) + return nodes[key] func set_node_user_data(i_col: int, i_row: int, user_data: Object) -> void: - var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row) - nodes[key] = user_data + var key: = DATA_KEY_FORMAT % [i_row, i_col] + nodes[key] = user_data func add_row(row_types: Array) -> void: - assert(row_types.size() < MAX_INDEX, 'ошибка: слишком много колонок, больше %d' % (MAX_INDEX + 1)) - if columns == 1: - set_columns(row_types.size()) - else: - assert(columns == row_types.size(), 'ошибка: %s количество колонок установлено ранее - %d, но требуется %d' % [self, columns, row_types.size()]) - var rows_count: int = get_rows_count() - assert(rows_count < MAX_INDEX, 'ошибка: слишком много рядов, больше %d' % (MAX_INDEX + 1)) - for i_col in columns: - var node = row_types[i_col].instantiate() - var key: String = NODE_KEY_FORMAT % [rows_count, i_col] - node.name = key - add_child(node) - nodes[key] = node + assert(row_types.size() < MAX_INDEX, 'ошибка: слишком много колонок, больше %d' % (MAX_INDEX + 1)) + if columns == 1: + set_columns(row_types.size()) + else: + assert(columns == row_types.size(), 'ошибка: %s количество колонок установлено ранее - %d, но требуется %d' % [self, columns, row_types.size()]) + var rows_count: int = get_rows_count() + assert(rows_count < MAX_INDEX, 'ошибка: слишком много рядов, больше %d' % (MAX_INDEX + 1)) + for i_col in columns: + var node = row_types[i_col].instantiate() + var key: String = NODE_KEY_FORMAT % [rows_count, i_col] + node.name = key + add_child(node) + nodes[key] = node func set_header(header_types: Array): - assert(header_types.size() < MAX_INDEX, 'ошибка: слишком много колонок, больше %d' % (MAX_INDEX + 1)) - if columns == 1: - set_columns(header_types.size()) - else: - assert(columns == header_types.size()) - var do_adj: = false - if not header: - header = GridContainer.new() - header.position = position - header.columns = header_types.size() - header.size.x = size.x - var parent = get_parent() - parent.add_child(header) - do_adj = true - else: - var childrens = header.get_children() - for node in childrens: - childrens.erase(node.name) - childrens.remove_child(node) - node.queue_free() - for i_col in columns: - var node = header_types[i_col].instantiate() - var key: String = HEAD_KEY_FORMAT % [0, i_col] - node.name = key - nodes[key] = node - header.add_child(node) - if do_adj: - var rect = [0, 0, 0, 0] - get_node_rect(0, 0, rect, HEAD_KEY_FORMAT) - position.y += rect[3] + assert(header_types.size() < MAX_INDEX, 'ошибка: слишком много колонок, больше %d' % (MAX_INDEX + 1)) + if columns == 1: + set_columns(header_types.size()) + else: + assert(columns == header_types.size()) + var do_adj: = false + if not header: + header = GridContainer.new() + header.position = position + header.columns = header_types.size() + header.size.x = size.x + var parent = get_parent() + parent.add_child(header) + do_adj = true + else: + var childrens = header.get_children() + for node in childrens: + childrens.erase(node.name) + childrens.remove_child(node) + node.queue_free() + for i_col in columns: + var node = header_types[i_col].instantiate() + var key: String = HEAD_KEY_FORMAT % [0, i_col] + node.name = key + nodes[key] = node + header.add_child(node) + if do_adj: + var rect = [0, 0, 0, 0] + get_node_rect(0, 0, rect, HEAD_KEY_FORMAT) + position.y += rect[3] func set_header_text(headers: Array): - assert(columns == headers.size()) - set_row_text(0, headers, 0, HEAD_KEY_FORMAT) + assert(columns == headers.size()) + set_row_text(0, headers, 0, HEAD_KEY_FORMAT) func get_node_user_data(i_col: int, i_row: int) -> Object: - var key: = get_node_key(DATA_KEY_FORMAT, i_col, i_row) - return nodes[key] + var key: = get_node_key(DATA_KEY_FORMAT, i_col, i_row) + return nodes[key] func remove_row(i_row: int): - var sel_key: String = ROW_SELECTOR_KEY_FORMAT % [i_row, 0] - if nodes.has(sel_key): - var selector = nodes[sel_key] - get_parent().remove_child(selector) - selector.queue_free() - nodes.erase(sel_key) - for i_col in columns: - var node_key: String = get_node_key(NODE_KEY_FORMAT, i_col, i_row) - var conn_key: String = CONNECTED_KEY_FORMAT % [i_row, i_col] - var data_key: String = DATA_KEY_FORMAT % [i_row, i_col] - var node = nodes[node_key] - nodes.erase(node_key) - remove_child(node) - node.queue_free() + var sel_key: String = ROW_SELECTOR_KEY_FORMAT % [i_row, 0] + if nodes.has(sel_key): + var selector = nodes[sel_key] + get_parent().remove_child(selector) + selector.queue_free() + nodes.erase(sel_key) + for i_col in columns: + var node_key: String = get_node_key(NODE_KEY_FORMAT, i_col, i_row) + var conn_key: String = CONNECTED_KEY_FORMAT % [i_row, i_col] + var data_key: String = DATA_KEY_FORMAT % [i_row, i_col] + var node = nodes[node_key] + nodes.erase(node_key) + remove_child(node) + node.queue_free() - if nodes.has(data_key): - nodes.erase(data_key) - if nodes.has(conn_key): - var conn = nodes[conn_key] - var callback = conn[0] - var dest_node = conn[1] - node.disconnect('pressed', Callable(dest_node, callback)) - nodes.erase(conn_key) + if nodes.has(data_key): + nodes.erase(data_key) + if nodes.has(conn_key): + var conn = nodes[conn_key] + var callback = conn[0] + var dest_node = conn[1] + node.disconnect('pressed', Callable(dest_node, callback)) + nodes.erase(conn_key) func rehash(swaps: Array): - """ Переназначает ключи в соответствии с размерами таблицы. - После вызова swaps содержит массив пар [<прежний ключ>, <текущий ключ>] """ - assert(not swaps.size(), 'ошибка: swaps не пустой') - var nodes_copy: = {} - var i_col: = 0 - var i_row: = 0 - for key0 in nodes: - if NODE_PREFIX in key0: - var node_key1: String = NODE_KEY_FORMAT % [i_row, i_col] - nodes_copy[node_key1] = nodes[key0] - swaps.append([key0, node_key1]) + """ Переназначает ключи в соответствии с размерами таблицы. + После вызова swaps содержит массив пар [<прежний ключ>, <текущий ключ>] """ + assert(not swaps.size(), 'ошибка: swaps не пустой') + var nodes_copy: = {} + var i_col: = 0 + var i_row: = 0 + for key0 in nodes: + if NODE_PREFIX in key0: + var node_key1: String = NODE_KEY_FORMAT % [i_row, i_col] + nodes_copy[node_key1] = nodes[key0] + swaps.append([key0, node_key1]) - var indxs = get_key_indexes(key0) + var indxs = get_key_indexes(key0) - var slct_key0: String = ROW_SELECTOR_KEY_FORMAT % [indxs[1], indxs[0]] - if nodes.has(slct_key0): - var slct_key1: String = ROW_SELECTOR_KEY_FORMAT % [i_row, i_col] - nodes_copy[slct_key1] = nodes[slct_key0] - swaps.append([slct_key0, slct_key1]) + var slct_key0: String = ROW_SELECTOR_KEY_FORMAT % [indxs[1], indxs[0]] + if nodes.has(slct_key0): + var slct_key1: String = ROW_SELECTOR_KEY_FORMAT % [i_row, i_col] + nodes_copy[slct_key1] = nodes[slct_key0] + swaps.append([slct_key0, slct_key1]) - var conn_key0: String = CONNECTED_KEY_FORMAT % [indxs[1], indxs[0]] - if nodes.has(conn_key0): - var conn_key1: String = CONNECTED_KEY_FORMAT % [i_row, i_col] - nodes_copy[conn_key1] = nodes[conn_key0] - swaps.append([conn_key0, conn_key1]) + var conn_key0: String = CONNECTED_KEY_FORMAT % [indxs[1], indxs[0]] + if nodes.has(conn_key0): + var conn_key1: String = CONNECTED_KEY_FORMAT % [i_row, i_col] + nodes_copy[conn_key1] = nodes[conn_key0] + swaps.append([conn_key0, conn_key1]) - var data_key0: String = DATA_KEY_FORMAT % [indxs[1], indxs[0]] - if nodes.has(data_key0): - var data_key1: String = DATA_KEY_FORMAT % [i_row, i_col] - nodes_copy[data_key1] = nodes[data_key0] - swaps.append([data_key0, data_key1]) + var data_key0: String = DATA_KEY_FORMAT % [indxs[1], indxs[0]] + if nodes.has(data_key0): + var data_key1: String = DATA_KEY_FORMAT % [i_row, i_col] + nodes_copy[data_key1] = nodes[data_key0] + swaps.append([data_key0, data_key1]) - i_col += 1 - if i_col == columns: - i_col = 0 - i_row += 1 - nodes.clear() - nodes.merge(nodes_copy) + i_col += 1 + if i_col == columns: + i_col = 0 + i_row += 1 + nodes.clear() + nodes.merge(nodes_copy) func clear_rows() -> void: - """ Удаляет все строки таблицы """ - var rows_count: int = get_rows_count() - for i_row in rows_count: - remove_row(i_row) + """ Удаляет все строки таблицы """ + var rows_count: int = get_rows_count() + for i_row in rows_count: + remove_row(i_row) func set_callbacks(dest_node: Node, event_name: String, callback: String, clmns: Array, user_data: Array) -> void: - """ Настраивает обратные вызовы для колонок. - :dest_node: Получатель события - :event_name: Имя события - :callback: Имя функции получателя события - :clmns: Индексы колонок - :user_data: Аргументы функции получателя события """ - var rows_count = get_rows_count() - for i_row in rows_count: - for i_col in clmns: - assert(i_col >= 0 and i_col < columns, 'ошибка: нет колонки %d' % i_col) - var node_key: String = NODE_KEY_FORMAT % [i_row, i_col] - var conn_key: String = CONNECTED_KEY_FORMAT % [i_row, i_col] - var node = nodes[node_key] - if nodes.has(conn_key): - var conn = nodes[conn_key] - var prev_callback = conn[0] - var prev_dest_node = conn[1] - node.disconnect(event_name, Callable(prev_dest_node, prev_callback)) - assert (OK == node.connect(event_name, Callable(dest_node, callback).bind([node] + user_data))) - nodes[conn_key] = [callback, dest_node] + """ Настраивает обратные вызовы для колонок. + :dest_node: Получатель события + :event_name: Имя события + :callback: Имя функции получателя события + :clmns: Индексы колонок + :user_data: Аргументы функции получателя события """ + var rows_count = get_rows_count() + for i_row in rows_count: + for i_col in clmns: + assert(i_col >= 0 and i_col < columns, 'ошибка: нет колонки %d' % i_col) + var node_key: String = NODE_KEY_FORMAT % [i_row, i_col] + var conn_key: String = CONNECTED_KEY_FORMAT % [i_row, i_col] + var node = nodes[node_key] + if nodes.has(conn_key): + var conn = nodes[conn_key] + var prev_callback = conn[0] + var prev_dest_node = conn[1] + node.disconnect(event_name, Callable(prev_dest_node, prev_callback)) + assert (OK == node.connect(event_name, Callable(dest_node, callback).bind([node] + user_data))) + nodes[conn_key] = [callback, dest_node] func set_rows_text(rows: Array) -> void: - for i_row in rows.size(): - for i_col in columns: - var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row) - var node = nodes[key] - node.text = rows[i_row][i_col] + for i_row in rows.size(): + for i_col in columns: + var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row) + var node = nodes[key] + node.text = rows[i_row][i_col] func set_nodes_min_size(i_row: int, sizes: Array, key_format: String = NODE_KEY_FORMAT) -> void: - for i_col in columns: - var key: = get_node_key(key_format, i_col, i_row) - var node = nodes[key] - node.custom_minimum_size.x = sizes[i_col] - node.size.x = sizes[i_col] + for i_col in columns: + var key: = get_node_key(key_format, i_col, i_row) + var node = nodes[key] + node.custom_minimum_size.x = sizes[i_col] + node.size.x = sizes[i_col] func set_node_text(i_col: int, i_row: int, val: String) -> void: - var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row) - nodes[key].text = val + var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row) + nodes[key].text = val func set_rows_state(rows: Array) -> void: - for i_row in rows.size(): - for i_col in columns: - var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row) - nodes[key].button_pressed = rows[i_row][i_col] + for i_row in rows.size(): + for i_col in columns: + var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row) + nodes[key].button_pressed = rows[i_row][i_col] func set_node_state(i_col: int, i_row: int, val: bool) -> void: - var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row) - nodes[key].button_pressed = val + var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row) + nodes[key].button_pressed = val func set_node_frame(i_col: int, i_row: int, node_name: String, val: int) -> void: - var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row) - var node = nodes[key] - var sprite = node.get_node(node_name) - sprite.frame = val + var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row) + var node = nodes[key] + var sprite = node.get_node(node_name) + sprite.frame = val func set_node_editable(i_col: int, i_row: int, val: bool) -> void: - var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row) - nodes[key].editable = val + var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row) + nodes[key].editable = val func set_node_alligment(i_col: int, i_row: int, val: int) -> void: - var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row) - if 'horizontal_alignment' in nodes[key]: - nodes[key].horizontal_alignment = val - elif 'alignment' in nodes[key]: - nodes[key].alignment = val + var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row) + if 'horizontal_alignment' in nodes[key]: + nodes[key].horizontal_alignment = val + elif 'alignment' in nodes[key]: + nodes[key].alignment = val func set_row_alligments(i_row: int, aligns: Array) -> void: - for i_col in columns: - var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row) - nodes[key].align = aligns[i_col] + for i_col in columns: + var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row) + nodes[key].align = aligns[i_col] func get_row_text(i_row: int) -> Array: - var row: = [] - for i_col in columns: - var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row) - row.append(nodes[key].text) - return row + var row: = [] + for i_col in columns: + var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row) + row.append(nodes[key].text) + return row func set_row_text(i_row: int, row: Array, i_begin: int = 0, key_format: String = NODE_KEY_FORMAT) -> void: - assert((i_begin + row.size()) < columns) - for i_col in columns - i_begin: - var key: = get_node_key(key_format, i_col + i_begin, i_row) - nodes[key].text = row[i_col] + for i_col in columns - i_begin: + var key: = get_node_key(key_format, i_col + i_begin, i_row) + nodes[key].text = row[i_col] func get_rows_text() -> Array: - var rows_count: = get_rows_count() - var rows: = [] - for i_row in rows_count: - var row = get_row_text(i_row) - rows.append(row) - return rows + var rows_count: = get_rows_count() + var rows: = [] + for i_row in rows_count: + var row = get_row_text(i_row) + rows.append(row) + return rows func get_row(i_row: int) -> Array: - var row: = [] - for i_col in columns: - var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row) - row.append(nodes[key]) - return row + var row: = [] + for i_col in columns: + var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row) + row.append(nodes[key]) + return row func get_node_rect(i_col: int, i_row: int, rect: Array, key_format: String = NODE_KEY_FORMAT) -> void: - assert(rect.size() >= 4, 'ошибка: мало элементов для возврата результата') - var key: = get_node_key(key_format, i_col, i_row) - var cell = nodes[key] - rect[0] = cell.position.x - rect[1] = cell.position.y - rect[2] = cell.size.x - rect[3] = cell.size.y + assert(rect.size() >= 4, 'ошибка: мало элементов для возврата результата') + var key: = get_node_key(key_format, i_col, i_row) + var cell = nodes[key] + rect[0] = cell.position.x + rect[1] = cell.position.y + rect[2] = cell.size.x + rect[3] = cell.size.y func get_row_rect(i_row: int, rect: Array, key_format: String = NODE_KEY_FORMAT) -> void: - assert(rect.size() >= 4, 'ошибка: мало элементов для возврата результата') - var cell0 = nodes[get_node_key(key_format, 0, i_row)] - var cell1 = nodes[get_node_key(key_format, columns - 1, i_row)] - rect[0] = cell0.position.x - rect[1] = cell0.position.y - rect[2] = (cell1.position.x - cell0.position.x) + cell1.size.x - rect[3] = cell0.size.y + assert(rect.size() >= 4, 'ошибка: мало элементов для возврата результата') + var cell0 = nodes[get_node_key(key_format, 0, i_row)] + var cell1 = nodes[get_node_key(key_format, columns - 1, i_row)] + rect[0] = cell0.position.x + rect[1] = cell0.position.y + rect[2] = (cell1.position.x - cell0.position.x) + cell1.size.x + rect[3] = cell0.size.y From 49167f5459f1e1608f4d3b3c36ab3f6af78b4112 Mon Sep 17 00:00:00 2001 From: MaD_CaT Date: Tue, 25 Jul 2023 14:29:30 +0300 Subject: [PATCH 3/6] =?UTF-8?q?=D0=A2=D0=B5=D1=81=D1=82=D0=BE=D0=B2=D1=8B?= =?UTF-8?q?=D0=B9=20=D0=BA=D0=BE=D0=BC=D0=BC=D0=B8=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- project.godot | 16 ++- scenes/bip.tscn | 4 +- scenes/frm_threats.gd | 35 ++++++ scenes/pribor_spt_r.tscn | 6 +- scenes/tab_switch.gd | 15 +++ scenes/tab_switch.tscn | 2 + scenes/журнал.gd | 10 ++ scenes/журнал.tscn | 21 ++-- scenes/работа.gd | 6 +- scenes/работа.tscn | 31 ++++-- scripts/capsrpb.gd | 38 +++++++ scripts/repnetwork.gd | 85 ++++++++++----- scripts/repsettings.gd | 28 +++++ scripts/threats.gd | 56 ++++++++++ scripts/tools.gd | 7 ++ scripts/yau07.gd | 54 +++++----- table/header.tscn | 4 +- table/node.tscn | 12 +-- table/table.gd | 225 +++++++++++++++++++++++++++++++++++++++ 19 files changed, 565 insertions(+), 90 deletions(-) create mode 100644 scenes/frm_threats.gd create mode 100644 scenes/tab_switch.gd create mode 100644 scripts/capsrpb.gd diff --git a/project.godot b/project.godot index 2d08c71..dba11e7 100644 --- a/project.godot +++ b/project.godot @@ -13,6 +13,7 @@ config_version=5 config/name="uarep-ctl" run/main_scene="res://scenes/tab_switch.tscn" config/features=PackedStringArray("4.1") +run/low_processor_mode=true run/delta_smoothing=false boot_splash/show_image=false boot_splash/fullsize=false @@ -21,11 +22,12 @@ config/icon="res://data/icon.png" [autoload] +Log="*res://addons/godot-logger/scripts/logger.gd" Tools="*res://scripts/tools.gd" REPSettings="*res://scripts/repsettings.gd" REPNetwork="*res://scripts/repnetwork.gd" yau07="*res://scripts/yau07.gd" -Log="*res://addons/godot-logger/scripts/logger.gd" +capsrpb="*res://scripts/capsrpb.gd" Table="*res://table/table.gd" Threats="*res://scripts/threats.gd" YemsDevs="*res://scripts/yems_devs.gd" @@ -33,6 +35,16 @@ YemsDevs="*res://scripts/yems_devs.gd" [debug] file_logging/enable_file_logging=true +gdscript/warnings/exclude_addons=false +gdscript/warnings/unassigned_variable=2 +gdscript/warnings/unassigned_variable_op_assign=2 +gdscript/warnings/shadowed_variable=2 +gdscript/warnings/shadowed_variable_base_class=2 +gdscript/warnings/shadowed_global_identifier=2 +gdscript/warnings/unsafe_cast=1 +gdscript/warnings/assert_always_true=2 +gdscript/warnings/assert_always_false=2 +gdscript/warnings/integer_division=0 [display] @@ -48,7 +60,7 @@ version_control/autoload_on_startup=true [editor_plugins] -enabled=PackedStringArray("res://addons/godot-logger/plugin.cfg") +enabled=PackedStringArray() [gui] diff --git a/scenes/bip.tscn b/scenes/bip.tscn index ec38fa0..18854c9 100644 --- a/scenes/bip.tscn +++ b/scenes/bip.tscn @@ -1,10 +1,10 @@ -[gd_scene load_steps=5 format=3 uid="uid://cfk41dnfbr0wx"] +[gd_scene load_steps=5 format=3 uid="uid://nl1vklubr5kr"] [ext_resource type="Shader" path="res://shaders/bip.gdshader" id="1_k6vue"] [sub_resource type="ShaderMaterial" id="ShaderMaterial_2dulj"] shader = ExtResource("1_k6vue") -shader_parameter/color = Color(0.666667, 0.690196, 0.807843, 1) +shader_parameter/color = Color(1, 0.101961, 0.494118, 1) [sub_resource type="PlaceholderTexture2D" id="PlaceholderTexture2D_tgf76"] diff --git a/scenes/frm_threats.gd b/scenes/frm_threats.gd new file mode 100644 index 0000000..7fe42c3 --- /dev/null +++ b/scenes/frm_threats.gd @@ -0,0 +1,35 @@ +extends "res://scenes/рамка.gd" + +var TableHeader = preload('res://table/header.tscn') +var TableNode = preload('res://table/node.tscn') + + +func _ready() -> void: + assert(TableHeader) + assert(TableNode) + call_deferred('init_table') + + +func init_table(): + $scrl_threats/tbl_threats.set_header([TableHeader, TableHeader, TableHeader, TableHeader]) + $scrl_threats/tbl_threats.set_header_text(['Номер', 'Пеленг', 'Частота, МГц', 'Назначено']) + $scrl_threats/tbl_threats.set_columns_min_size([50, 140, 140, 100]) + $scrl_threats/tbl_threats.pin_header($scrl_threats, self) + $scrl_threats/tbl_threats.connect('row_pressed', Callable(self, 'on_row_pressed')) + + +func on_row_pressed(i_row: int): + $scrl_threats/tbl_threats.set_row_selected(i_row, true) + + +func _on_btn_add_thr_pressed() -> void: + var i_row = $scrl_threats/tbl_threats.get_rows_count() + $scrl_threats/tbl_threats.add_row([TableNode, TableNode, TableNode, TableNode]) + $scrl_threats/tbl_threats.set_row_text(i_row, ['%d' % i_row, '%d' % ((i_row * 100) + 2000), '%d' % ((i_row * 20) % 360), 'Нет']) + + +func _on_btn_del_thr_pressed() -> void: + var i_rows: = Array() + $scrl_threats/tbl_threats.get_selected_rows(i_rows) + for i in i_rows: + $scrl_threats/tbl_threats.remove_row(i) diff --git a/scenes/pribor_spt_r.tscn b/scenes/pribor_spt_r.tscn index 62c0337..6834bbe 100644 --- a/scenes/pribor_spt_r.tscn +++ b/scenes/pribor_spt_r.tscn @@ -1,10 +1,6 @@ -[gd_scene format=2] +[gd_scene format=3 uid="uid://bv0dyyaodxcvc"] [node name="pribor_UF" type="Node2D"] [node name="test_label" type="Label" parent="."] -margin_left = 12.0 -margin_top = 8.0 -margin_right = 154.0 -margin_bottom = 22.0 text = "Здесь будет схема прибора СПТ Правый" diff --git a/scenes/tab_switch.gd b/scenes/tab_switch.gd new file mode 100644 index 0000000..c287888 --- /dev/null +++ b/scenes/tab_switch.gd @@ -0,0 +1,15 @@ +extends TabContainer + + +# Called when the node enters the scene tree for the first time. +func _ready() -> void: + pass + + +# Called every frame. 'delta' is the elapsed time since the previous frame. +func _process(delta: float) -> void: + pass + + +func _enter_tree() -> void: + REPNetwork.logger_page = $'журнал' diff --git a/scenes/tab_switch.tscn b/scenes/tab_switch.tscn index aec5f96..32af829 100644 --- a/scenes/tab_switch.tscn +++ b/scenes/tab_switch.tscn @@ -1,5 +1,6 @@ [gd_scene load_steps=5 format=3 uid="uid://3slb0i3pvowc"] +[ext_resource type="Script" path="res://scenes/tab_switch.gd" id="1_33fiq"] [ext_resource type="PackedScene" uid="uid://b276iygic5itk" path="res://scenes/работа.tscn" id="1_uow82"] [ext_resource type="PackedScene" uid="uid://lwmw4egynmd1" path="res://scenes/контроль.tscn" id="2_83m7a"] [ext_resource type="PackedScene" uid="uid://trt0q8th3bn2" path="res://scenes/журнал.tscn" id="3_hgnup"] @@ -8,6 +9,7 @@ [node name="tab_switch" type="TabContainer"] offset_right = 1600.0 offset_bottom = 1200.0 +script = ExtResource("1_33fiq") [node name="работа" parent="." instance=ExtResource("1_uow82")] layout_mode = 2 diff --git a/scenes/журнал.gd b/scenes/журнал.gd index 214a680..6d19807 100644 --- a/scenes/журнал.gd +++ b/scenes/журнал.gd @@ -1,9 +1,19 @@ extends Control +func _ready() -> void: Log.info('Модуль журнала работы готов') +func on_line_changed(unit, addr): Log.message(Logger.INFO, 'состоянии связи: %s %s' % [unit, addr]) +func on_command_fail(unit, addr): Log.message(Logger.ERROR, 'команда не выполнена: %s %s' % [unit, addr]) + + func _on_clear_button_down() -> void: +<<<<<<< HEAD $content.clear() Log.info('содержание журнала очищено оператором') +======= + $content.clear() + Log.info('Cодержание журнала очищено оператором') +>>>>>>> sasha/master func _on_btn_save_button_down() -> void: diff --git a/scenes/журнал.tscn b/scenes/журнал.tscn index cfd4ac8..5d29c55 100644 --- a/scenes/журнал.tscn +++ b/scenes/журнал.tscn @@ -15,10 +15,11 @@ script = ExtResource("1_3f1mv") [node name="content" type="RichTextLabel" parent="."] layout_mode = 0 offset_left = 16.0 -offset_top = 57.0 +offset_top = 16.0 offset_right = 1584.0 -offset_bottom = 999.0 +offset_bottom = 1059.0 focus_mode = 2 +theme_override_colors/selection_color = Color(0.72549, 0.270588, 0.133333, 1) threaded = true selection_enabled = true deselect_on_focus_loss_enabled = false @@ -26,18 +27,18 @@ script = ExtResource("1_t5g4h") [node name="btn_save" type="Button" parent="."] layout_mode = 0 -offset_left = 1344.0 -offset_top = 1044.0 -offset_right = 1440.0 -offset_bottom = 1080.0 +offset_left = 1464.0 +offset_top = 1080.0 +offset_right = 1560.0 +offset_bottom = 1116.0 text = "Сохранить" [node name="btn_clear" type="Button" parent="."] layout_mode = 0 -offset_left = 1200.0 -offset_top = 1044.0 -offset_right = 1296.0 -offset_bottom = 1080.0 +offset_left = 1344.0 +offset_top = 1080.0 +offset_right = 1440.0 +offset_bottom = 1116.0 text = "Очистить" [node name="dlg_file" type="FileDialog" parent="."] diff --git a/scenes/работа.gd b/scenes/работа.gd index 74ea742..fa9ed2a 100644 --- a/scenes/работа.gd +++ b/scenes/работа.gd @@ -9,7 +9,6 @@ extends Panel @export var drag_scale_width: float @export var drag_scale_band: float @export var window_0_id: int -@export var window_1_id: int signal add_imit_threat (signal_name: String) signal del_imit_threat (signal_name: String) @@ -156,9 +155,14 @@ func toggle_full_screen(id: int): func _on_full_screen(): +<<<<<<< HEAD toggle_full_screen(window_1_id) toggle_full_screen(window_0_id) func _on_btn_down(signal_name: String) -> void: emit_signal(signal_name) +======= + toggle_full_screen(window_0_id) + +>>>>>>> sasha/master diff --git a/scenes/работа.tscn b/scenes/работа.tscn index 02292ff..e9a3cb6 100644 --- a/scenes/работа.tscn +++ b/scenes/работа.tscn @@ -1,9 +1,10 @@ -[gd_scene load_steps=7 format=3 uid="uid://b276iygic5itk"] +[gd_scene load_steps=8 format=3 uid="uid://b276iygic5itk"] [ext_resource type="Script" path="res://scenes/работа.gd" id="1_qjoce"] [ext_resource type="PackedScene" uid="uid://b5kjdyxuwsot5" path="res://scenes/canvas.tscn" id="2_bl0yt"] [ext_resource type="PackedScene" uid="uid://bq7haw1ypiv48" path="res://scenes/frame.tscn" id="3_l1omj"] [ext_resource type="PackedScene" uid="uid://da7w3vkhadfwe" path="res://scenes/button_flat.tscn" id="4_5es2r"] +[ext_resource type="Script" path="res://scenes/frm_threats.gd" id="4_hg23i"] [ext_resource type="Script" path="res://table/table.gd" id="4_mqhcf"] [sub_resource type="StyleBoxFlat" id="StyleBoxFlat_5ugj8"] @@ -18,7 +19,6 @@ strob_min_band = 0.1 strob_max_band = 15.538 drag_scale_width = 0.5 drag_scale_band = 0.05 -window_1_id = 1 metadata/_edit_vertical_guides_ = [] metadata/_edit_lock_ = true @@ -31,19 +31,15 @@ offset_left = 1121.0 offset_top = 6.0 offset_right = 1594.0 offset_bottom = 642.0 +script = ExtResource("4_hg23i") text = "Список целей" - -[node name="tbl_threats" type="GridContainer" parent="frm_threats"] -layout_mode = 0 -offset_right = 40.0 -offset_bottom = 40.0 -script = ExtResource("4_mqhcf") +metadata/_edit_lock_ = true [node name="рамка-параметры-цели" parent="frm_threats" instance=ExtResource("3_l1omj")] layout_mode = 0 offset_left = 5.0 offset_top = 313.0 -offset_right = 467.0 +offset_right = 465.0 offset_bottom = 632.0 text = "Параметры цели" @@ -218,6 +214,19 @@ scale = Vector2(1, 0.6) tooltip_text = "Удалить цель" text = "-" +[node name="scrl_threats" type="ScrollContainer" parent="frm_threats"] +layout_mode = 0 +offset_left = 8.0 +offset_top = 57.0 +offset_right = 464.0 +offset_bottom = 306.0 +horizontal_scroll_mode = 0 + +[node name="tbl_threats" type="GridContainer" parent="frm_threats/scrl_threats"] +layout_mode = 2 +columns = 4 +script = ExtResource("4_mqhcf") + [node name="рамка-сеансы-помех" parent="." instance=ExtResource("3_l1omj")] layout_mode = 0 offset_left = 1121.0 @@ -647,5 +656,5 @@ metadata/rfi_name = "" [connection signal="drag_begin" from="." to="." method="_on_drag_begin"] [connection signal="drag_continue" from="." to="." method="_on_drag_continue"] [connection signal="full_screen" from="." to="." method="_on_full_screen" flags=3] -[connection signal="button_down" from="frm_threats/btn_add_thr" to="." method="_on_btn_down" binds= ["add_imit_threat"]] -[connection signal="button_down" from="frm_threats/btn_del_thr" to="." method="_on_btn_down" binds= ["del_imit_threat"]] +[connection signal="pressed" from="frm_threats/btn_add_thr" to="frm_threats" method="_on_btn_add_thr_pressed"] +[connection signal="pressed" from="frm_threats/btn_del_thr" to="frm_threats" method="_on_btn_del_thr_pressed"] diff --git a/scripts/capsrpb.gd b/scripts/capsrpb.gd new file mode 100644 index 0000000..435266b --- /dev/null +++ b/scripts/capsrpb.gd @@ -0,0 +1,38 @@ +extends Node + +const ONLINE_TIMEOUT = 5.0 # Время ожидания пакета от ячейки, секунды +const BUFFER_SIZE = 2048 + + +class CapsRpb: + signal line_changed(unit: CapsRpb) + signal command_done(unit: CapsRpb) + signal command_fail(unit: CapsRpb) + var online: = false + var name: = String() + var test_json_conv: JSON + var tick: = 0.0 + var tick_rx: = 0.0 + + func _to_string() -> String: return String('капсрпб: "%s" %s ' % [self.name, ['отключен', 'на связи'][int(online)]]) + func _init(nm): + test_json_conv = JSON.new() + self.name = nm + + + func parse(data): + tick_rx = tick + if not online: + online = true + emit_signal('line_changed', self) + var utf8_data = data.get_string_from_utf8() + test_json_conv.parse(utf8_data) + var json = test_json_conv.get_data() + print_debug(json) + + + func process(delta: float): + tick += delta + if online and ((tick - tick_rx) > ONLINE_TIMEOUT): + online = false + emit_signal('line_changed', self) diff --git a/scripts/repnetwork.gd b/scripts/repnetwork.gd index 3f9f59e..dbbf81a 100644 --- a/scripts/repnetwork.gd +++ b/scripts/repnetwork.gd @@ -1,36 +1,69 @@ extends Node -var sock_unicast: PacketPeerUDP -var sock_broadcast: PacketPeerUDP -var units_yau07: Dictionary +class Socket extends PacketPeerUDP: + func send_to(addr, data): + self.set_dest_address(addr[0], addr[1]) + self.put_packet(data) + + +const PROTO_TYPE: = {'yau07tx': yau07.YaU07, 'jsontx': capsrpb.CapsRpb} +var poll_sockets: Array[Socket] +var units: Dictionary +var sock_unicast: Socket +var logger_page: Node + + +func create_socket(nm) -> Socket: + var addr = REPSettings.addr[nm][1] + var port = REPSettings.addr[nm][2] + var broad = REPSettings.addr[nm][3] + var bind = REPSettings.addr[nm][4] + var sock: = Socket.new() + sock.set_broadcast_enabled(broad) + var rc = Error.OK if not bind else sock.bind(port, addr) + var errlevel = Log.INFO if rc == Error.OK else Log.ERROR + Log.message(errlevel, '%s: сокет:%s:%d привязанный:%s %s' % [nm, addr, port, ['нет', 'да'][int(bind)], error_string(rc)]) + return sock func _ready() -> void: - var addr = REPSettings.addr['уарэп-яу07-частный'][1] - var port = REPSettings.addr['уарэп-яу07-частный'][2] - sock_unicast = PacketPeerUDP.new() - sock_unicast.bind(port, addr) + Log.info('Сетевой модуль готов') + poll_sockets.append(create_socket('уарэп-яу07-частный')) + poll_sockets.append(create_socket('уарэп-яу07-общий')) + poll_sockets.append(create_socket('уарэп-капсрпб-пол')) + + sock_unicast = poll_sockets[0] + for key in REPSettings.addr: - var prof = REPSettings.addr[key] - if prof[0] == 'yau07': - addr = REPSettings.addr[key][1] - port = REPSettings.addr[key][2] - var unit = yau07.YaU07.new([addr, port]) - var addr_port: String = '%s:%d' % [addr, port] - units_yau07[addr_port] = unit - Log.info('ЯУ-07: %s' % unit) + var setting = REPSettings.addr[key] + var proto = setting[0] + if proto in PROTO_TYPE: + var unit = PROTO_TYPE[proto].new(key) + var addr = Array([setting[1], setting[2]]) + units[addr] = unit + unit.connect('line_changed', Callable(logger_page, 'on_line_changed').bind(addr)) + unit.connect('command_fail', Callable(logger_page, 'on_command_fail').bind(addr)) + + for addr in units: + var unit = units[addr] + Log.info('%s %s:%d' % [unit.name, addr[0], addr[1]]) + + +func poll_receive(sock: Socket): + while sock.get_available_packet_count() > 0: + var data: = sock.get_packet() + var addr: = sock.get_packet_ip() + var port: = sock.get_packet_port() + var addr_port: = [addr, port] + if addr_port in units: units[addr_port].parse(data) func _process(delta: float) -> void: - for unit in units_yau07.values() as Array[yau07.YaU07]: - unit.process(delta, sock_unicast) - - while sock_unicast.get_available_packet_count() > 0: - var data = sock_unicast.get_packet() - var addr = sock_unicast.get_packet_ip() - var port = sock_unicast.get_packet_port() - var addr_port: String = '%s:%d' % [addr, port] - if addr_port in units_yau07: - var unit: yau07.YaU07 = units_yau07[addr_port] - unit.parse(data) + for addr in units: + var unit = units[addr] + match unit.process(delta): + Error.OK: sock_unicast.send_to(addr, unit.data_tx) + Error.FAILED: emit_signal('socket_error', 'ошибка: %s %s:%d' % [unit, addr[0], addr[1]]) + for sock in poll_sockets: + poll_receive(sock) diff --git a/scripts/repsettings.gd b/scripts/repsettings.gd index c2780f3..e069f9d 100644 --- a/scripts/repsettings.gd +++ b/scripts/repsettings.gd @@ -1,5 +1,6 @@ extends Node +<<<<<<< HEAD @export var addr: Dictionary = { \ 'уарэп-яу07-частный': ['udp', '10.1.1.160', 50160, 'IP-адрес ЯУ-07 прибора УФ'], 'уарэп-яу07-общий': ['udp', '10.1.1.255', 50000, 'IP-адрес для приёма широковещательных пакетов от ЯУ-07'], @@ -19,3 +20,30 @@ extends Node 'уарэп-яу07-3н': ['yau07', '10.1.1.49', 50049, 'IP-адрес ЯУ-07 прибора ПРД-Н'], 'уарэп-яу07-3к': ['yau07', '10.1.1.51', 50051, 'IP-адрес ЯУ-07 прибора ПРД-Н'], 'уарэп-щ3': ['uart', '/dev/stty0', 115200, 1, 1, false, 1000, 'Прибор Щ3 (скорость, стартовых, стоповых, чётность, таймаут в мкс)'] } +======= + +@export var addr: = { \ +# Название Протокол Адрес Порт Широков. Привяз. Комментарий + 'уарэп-яу07-частный': ['yau07rx', '127.0.0.1', 50079, false, true, 'IP-адрес на котором принимают частные сообщения от ЯУ-07'], + 'уарэп-яу07-общий': ['yau07rx', '127.0.0.255', 50000, true, true, 'IP-адрес на котором принимают широковещательные сообщения от ЯУ-07'], + 'уарэп-капсрпб-пол': ['jsonrx', '127.0.0.1', 42023, false, true, 'IP-адрес на котором принимают сообщения от КАПС РПБ'], + 'уарэп-капсрпб-отп': ['jsontx', '127.0.0.1', 42022, false, false, 'IP-адрес на который отправляют сообщения для КАПС РПБ'], + 'уарэп-эмс': ['yau07tx', '10.1.1.27', 50027, false, false, 'IP-адрес ЯУ-07 прибора УФ'], + 'уарэп-яу07-2в': ['yau07tx', '10.1.1.34', 50034, false, false, 'IP-адрес ЯУ-07 прибора ПРД-В'], + 'уарэп-яу07-2н': ['yau07tx', '10.1.1.33', 50033, false, false, 'IP-адрес ЯУ-07 прибора ПРД-Н'], + 'уарэп-яу07-2к': ['yau07tx', '10.1.1.35', 50035, false, false, 'IP-адрес ЯУ-07 прибора ПРД-К'], + 'уарэп-яу07-4в': ['yau07tx', '10.1.1.66', 50066, false, false, 'IP-адрес ЯУ-07 прибора ПРД-В'], + 'уарэп-яу07-4н': ['yau07tx', '10.1.1.65', 50065, false, false, 'IP-адрес ЯУ-07 прибора ПРД-Н'], + 'уарэп-яу07-4к': ['yau07tx', '10.1.1.67', 50067, false, false, 'IP-адрес ЯУ-07 прибора ПРД-К'], + 'уарэп-яу07-1в': ['yau07tx', '10.1.1.18', 50018, false, false, 'IP-адрес ЯУ-07 прибора ПРД-В'], + 'уарэп-яу07-1н': ['yau07tx', '10.1.1.17', 50017, false, false, 'IP-адрес ЯУ-07 прибора ПРД-Н'], + 'уарэп-яу07-1к': ['yau07tx', '10.1.1.19', 50019, false, false, 'IP-адрес ЯУ-07 прибора ПРД-К'], + 'уарэп-яу07-3в': ['yau07tx', '10.1.1.50', 50050, false, false, 'IP-адрес ЯУ-07 прибора ПРД-В'], + 'уарэп-яу07-3н': ['yau07tx', '10.1.1.49', 50049, false, false, 'IP-адрес ЯУ-07 прибора ПРД-Н'], + 'уарэп-яу07-3к': ['yau07tx', '10.1.1.51', 50051, false, false, 'IP-адрес ЯУ-07 прибора ПРД-Н'], + 'уарэп-щ3': ['uart', '/dev/stty0', 115200, 1, 1, false, 1000, 'Прибор Щ3'] } # скорость, стартовых, стоповых, чётность, таймаут в мкс + + +func _ready() -> void: + Log.info('Модуль настроек готов') +>>>>>>> sasha/master diff --git a/scripts/threats.gd b/scripts/threats.gd index 209db54..75717a8 100644 --- a/scripts/threats.gd +++ b/scripts/threats.gd @@ -1,8 +1,15 @@ extends Node +enum ThreatSrc { + SIGMA, + RLKS, + RPB, + MP405 } + class Threat: +<<<<<<< HEAD enum FFlags { # Допустимые значения для Threat.fflags NONE = 0, TMOD = 1, BAUD = 2, PROTO = 4, SLON = 8, SLAT = 16, SALT = 32, LAT = 64, @@ -27,3 +34,52 @@ class Threat: var lon: float # Текущие координаты, широта в градусах. Достоверность задана значением Threat.fflags var alt: float # Текущая высота, метры. Достоверность задана значением Threat.fflags var fflags: FFlags # Флаги достоверности полей +======= + enum FFlags { # Допустимые значения для Threat.fflags + TMOD = 1 << 0, + BAUD = 1 << 1, + PROTO = 1 << 2, + SLON = 1 << 3, + SLAT = 1 << 4, + SALT = 1 << 5, + LAT = 1 << 6, + LON = 1 << 7, + ALT = 1 << 8, + AOA = 1 << 9, + FREQ = 1 << 10, + WIDTH = 1 << 11, + } + + var aoa: float # Курсовой угол на источник сигнала, градусы. + var freq: float # Частота несущей или центральная частота, МГц + var width: float # Ширина занимаемого диапазона частот, МГц + var pow_rx: float # Уровень принимаемого сигнала, дБм + var tick: int # Время приёма сигнала, мс + var freqm: String # Режим смены частоты + var rkrp: String # Рекомендуемый режим помехи + var rparams: String # Рекомендуемые параметры помехи + var tmod: String # Тип модуляции + var baud: float # Модуляционная скорость + var proto: String # Тип протокола источника сигнала + var slon: float # Координаты старта, долгота в градусах. Достоверность задана значением Threat.fflags + var slat: float # Координаты старта, широта в градусах. Достоверность задана значением Threat.fflags + var salt: float # Координаты старта, высота от уровня моря. метры. Достоверность задана значением Threat.fflags + var lat: float # Текущие координаты, долгота в градусах. Достоверность задана значением Threat.fflags + var lon: float # Текущие координаты, широта в градусах. Достоверность задана значением Threat.fflags + var alt: float # Текущая высота, метры. Достоверность задана значением Threat.fflags + var atime: Dictionary # Время обнаружения + var utime: Dictionary # Время крайнего обновления + var fflags: FFlags # Флаги достоверности полей + + +var _threats = {} +""" +Список целей. Индекс - <источник цели>:<номер цели> +Источник цели может быть: 'RPB', 'SIGMA', 'RLKS', 'MP405' +""" + + +func _ready() -> void: + Log.info('Модуль обработки целей готов') + +>>>>>>> sasha/master diff --git a/scripts/tools.gd b/scripts/tools.gd index 0f7019e..b536fbe 100644 --- a/scripts/tools.gd +++ b/scripts/tools.gd @@ -1,6 +1,13 @@ extends Node +func assert_array_ipaddr(val: Array): + """ Выкидывает исключение, если массив не содержит ip-адрес """ + assert(val[0] is String) + assert(val[1] is int) + assert((0 < val[1]) and (val[1] < 65536)) + + func map_dec_to_rad(pos0: Vector2, pos: Vector2) -> Vector2: """ Преобразует декартовые координаты в полярные """ var x1: float = pos.x - pos0.x diff --git a/scripts/yau07.gd b/scripts/yau07.gd index d851418..acda9c0 100644 --- a/scripts/yau07.gd +++ b/scripts/yau07.gd @@ -1,11 +1,14 @@ extends Node +# Протокол ячейки ЯУ-07 + const ONLINE_TIMEOUT = 5.0 # Время ожидания пакета от ячейки, секунды const RESEND_TIMEOUT = 0.3 # Задержка для повторной отправки команды, секунды const RETRY_COUNT = 5 # Количество повторных отправок -const DEFAULT_ADDR = ['localhost', 50000] const BUFFER_SIZE = 2048 + + # Ячейка ЯУ-07 class YaU07: @@ -20,12 +23,11 @@ class YaU07: DONE, # Команда выполнена FAIL } # Команда не выполнена - signal online_changed(yau07: YaU07) - signal command_done(yau07: YaU07) - signal command_fail(yau07: YaU07) - signal net_error(message: String) + signal line_changed(unit: YaU07) + signal command_done(unit: YaU07) + signal command_fail(unit: YaU07) - var src_addr: = DEFAULT_ADDR # Адрес источника + var name: = String() var cmd_num_rx: = 0 # Номер команды принятый var cmd_num_tx: = 0 # Номер команды переданный var cmd_state = CmdState.UNCK # Состояние выполнения команды @@ -41,39 +43,39 @@ class YaU07: var isa_ports = {} # Результат выполнения команды "читать порт" var online = false - func _to_string() -> String: - return '%s %s:%d cmd_num:%d' % [['отключен', 'на связи'][int(online)], src_addr[0], src_addr[1], cmd_num_rx] + func _to_string() -> String: return String('яу07: %s %s' % [self.name, ['отключен', 'на связи'][int(online)]]) - func _init(addr: Array): - src_addr = addr + func _init(nm): + self.name = nm tx_data.resize(BUFFER_SIZE) tx_data.fill(0) + tick = 0.0 - func process(delta: float, sock: PacketPeerUDP): + func process(delta: float): tick += delta + if online and ((tick - cmd_tick_rx) > ONLINE_TIMEOUT): + online = false + emit_signal('line_changed', self) + + var rc = Error.ERR_BUSY if cmd_state == CmdState.SEND: - sock.set_dest_address(src_addr[0], src_addr[1]) - if sock.put_packet(tx_data.slice(0, tx_len)) == OK: - cmd_tick_tx = tick - cmd_state = CmdState.WAIT - cmd_retry = RETRY_COUNT + rc = rc.OK + cmd_tick_tx = tick + cmd_state = CmdState.WAIT + cmd_retry = RETRY_COUNT elif cmd_state == CmdState.WAIT: if cmd_retry: if (tick - cmd_tick_tx) > RESEND_TIMEOUT: - sock.set_dest_address(src_addr[0], src_addr[1]) - if sock.put_packet(tx_data.slice(0, tx_len)) == OK: - cmd_tick_tx = tick - else: - emit_signal('socket_error', 'ошибка: пакет не отправлен на: %s' % src_addr) + rc = Error.OK + cmd_tick_tx = tick cmd_retry -= 1 else: cmd_state = CmdState.FAIL emit_signal('command_fail', self) - if online and ((tick - cmd_tick_rx) > ONLINE_TIMEOUT): - online = false - emit_signal('online_changed', self) + rc = Error.FAILED + return rc func send_isa(cmd_code: int, ports_data: Array) -> bool: @@ -151,7 +153,7 @@ class YaU07: if not online: online = true - emit_signal('online_changed', self) + emit_signal('line_changed', self) var rx_data_len = rx_data.size() if rx_data_len < 11: @@ -187,7 +189,7 @@ class YaU07: if cmd_result != 1: # Команда не выполнена return false - var cmd_code: CmdCode = rx_data[cmd_code_pos] # "код команды" + var cmd_code: CmdCode = rx_data[cmd_code_pos] as CmdCode # "код команды" if (cmd_code == CmdCode.READ_ISA) or (cmd_code == CmdCode.WRITE_ISA): parse_isa(rx_data, status_len) diff --git a/table/header.tscn b/table/header.tscn index b65e7dc..24b90a1 100644 --- a/table/header.tscn +++ b/table/header.tscn @@ -3,8 +3,10 @@ [sub_resource type="StyleBoxFlat" id="StyleBoxFlat_2thpi"] bg_color = Color(0.8, 0.533333, 0.27451, 1) -[node name="heder" type="Label"] +[node name="header" type="Label"] offset_right = 128.0 offset_bottom = 23.0 theme_override_colors/font_color = Color(0, 0, 0, 1) theme_override_styles/normal = SubResource("StyleBoxFlat_2thpi") +horizontal_alignment = 1 +vertical_alignment = 1 diff --git a/table/node.tscn b/table/node.tscn index 96c26f5..120347d 100644 --- a/table/node.tscn +++ b/table/node.tscn @@ -1,10 +1,10 @@ -[gd_scene load_steps=2 format=3 uid="uid://c1i4rwaajq7d5"] +[gd_scene format=3 uid="uid://c1i4rwaajq7d5"] -[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_7jiwk"] - -[node name="Label" type="Label"] +[node name="Label" type="LineEdit"] offset_right = 121.0 offset_bottom = 23.0 theme_override_colors/font_color = Color(1, 0.596078, 0.4, 1) -theme_override_styles/normal = SubResource("StyleBoxFlat_7jiwk") -clip_text = true +editable = false +context_menu_enabled = false +caret_blink = true +caret_blink_interval = 0.1 diff --git a/table/table.gd b/table/table.gd index 105eb27..fb62c3c 100644 --- a/table/table.gd +++ b/table/table.gd @@ -32,6 +32,19 @@ var header: GridContainer # Заголовок таблицы signal row_pressed(i_row: int) # Вызывается при нажатии кнопкой мыши на строку signal selected_changed(i_row: int) # Вызывается при изменении выбранного ряда. i_row - текущий выбранный ряд +var scroll: Control +var scroll_adj: = Vector2(0, 0) + + +func pin_header(scrl: ScrollContainer, prnt): + scrl.remove_child(header) + prnt.add_child(header) + # TODO: Это значение следует получить из темы + var v_separation: = 3.0 + header.position = scrl.position - Vector2(0, header.size.y + v_separation) + scroll = scrl + scroll_adj = scrl.position + func selector_up(): var i_rows: = [] @@ -93,11 +106,19 @@ func _ready(): assert(ScnNode) +<<<<<<< HEAD func align_to_left_bottom(header, gap: = Vector2(0, 0)): """ Выравнивает по нижнему левому углу. Используется для выравнивания по заголовку """ position.x = header.position.x + gap.x position.y = header.position.y + header.size.y + gap.y +======= +func align_to_left_bottompos(hdr: Control, gap: = Vector2(0, 0)): + """ Выравнивает по нижнему левому углу. + Используется для выравнивания по заголовку """ + position.x = hdr.position.x + gap.x + position.y = hdr.position.y + hdr.size.y + gap.y +>>>>>>> sasha/master func _assert_meta(i_col: int, i_row: int, pname: String, node): @@ -156,6 +177,7 @@ func set_columns_aligment(alignments: Array) -> void: func _input(event) -> void: +<<<<<<< HEAD if event is InputEventKey: if in_focus and event.pressed: if event.keycode == selector_key_up: @@ -192,6 +214,41 @@ func _init() -> void: assert(selector_color_proc.is_valid()) selector_size_proc = Callable(self, 'default_selector_size_proc') assert(selector_size_proc.is_valid()) +======= + if event is InputEventKey: + if in_focus and event.pressed: + if event.keycode == selector_key_up: + selector_up() + elif event.keycode == selector_key_down: + selector_down() + elif event is InputEventMouseButton: + if not event.pressed: + return + if check_event_pos(event.position, scroll): + if not in_focus: + in_focus = true + emit_signal('focus_entered') + elif not check_event_pos(event.position, scroll): + if in_focus: + in_focus = false + emit_signal('focus_exited') + + +func _init() -> void: + selector_color_proc = Callable(self, 'defaultselector_color_proc') + assert(selector_color_proc.is_valid()) + selector_size_proc = Callable(self, 'default_selector_size_proc') + assert(selector_size_proc.is_valid()) + scroll = self + + +func check_event_pos(event_pos: Vector2, obj: Control): + return \ + (event_pos.x > obj.position.x) \ + and (event_pos.x < (obj.position.x + obj.size.x)) \ + and (event_pos.y > obj.position.y) \ + and (event_pos.y < (obj.position.y + obj.size.y)) +>>>>>>> sasha/master func defaultselector_color_proc(_i_row: int): @@ -209,11 +266,19 @@ func set_selector_size_proc(instance: Object, function: String) -> void: func default_selector_size_proc(i_row: int, rect: Array) -> void: +<<<<<<< HEAD get_row_rect(i_row, rect) rect[0] = rect[0] + position.x - node_gap.x / 2.0 rect[1] = rect[1] + position.y - node_gap.y / 2.0 rect[2] = rect[2] + node_gap.x rect[3] = rect[3] + node_gap.y +======= + get_row_rect(i_row, rect) + rect[0] += position.x - node_gap.x / 2.0 + rect[1] += position.y - node_gap.y / 2.0 + rect[2] += node_gap.x + rect[3] += node_gap.y +>>>>>>> sasha/master func clear_rows_selected(): @@ -223,6 +288,7 @@ func clear_rows_selected(): func set_row_selected(i_row: int, selected: bool = true) -> void: +<<<<<<< HEAD var key: = ROW_SELECTOR_KEY_FORMAT % [i_row, 0] var parent = get_parent() if nodes.has(key) and (not selected): @@ -253,6 +319,37 @@ func get_selected_rows(rows: Array) -> void: if SLCT_PREFIX in key: var indexes = get_key_indexes(key) rows.append(indexes[1]) +======= + var key: = ROW_SELECTOR_KEY_FORMAT % [i_row, 0] + var node = nodes[NODE_KEY_FORMAT % [i_row, 0]] + if nodes.has(key) and (not selected): + var selector = nodes[key] + node.remove_child(selector) + selector.queue_free() + nodes.erase(key) + elif (not nodes.has(key)) and selected: + var selector = ScnSelector.instantiate() + var rect: = [0, 0, 0, 0] + selector_size_proc.call(i_row, rect) + selector.size.x = rect[2] + selector.size.y = rect[3] + selector.modulate = selector_color_proc.call(i_row) + selector.z_index = z_index + 1 + nodes[key] = selector + node.add_child(selector) + + +func is_row_selected(i_row: int) -> bool: + var key: = ROW_SELECTOR_KEY_FORMAT % [i_row, 0] + return nodes.has(key) + + +func get_selected_rows(i_rows: Array) -> void: + for key in nodes.keys(): + if SLCT_PREFIX in key: + var indexes = get_key_indexes(key) + i_rows.append(indexes[1]) +>>>>>>> sasha/master func get_rows_count() -> int: @@ -273,6 +370,7 @@ func set_node_user_data(i_col: int, i_row: int, user_data: Object) -> void: func add_row(row_types: Array) -> void: +<<<<<<< HEAD assert(row_types.size() < MAX_INDEX, 'ошибка: слишком много колонок, больше %d' % (MAX_INDEX + 1)) if columns == 1: set_columns(row_types.size()) @@ -319,6 +417,63 @@ func set_header(header_types: Array): var rect = [0, 0, 0, 0] get_node_rect(0, 0, rect, HEAD_KEY_FORMAT) position.y += rect[3] +======= + assert(row_types.size() < MAX_INDEX, 'ошибка: слишком много колонок, больше %d' % (MAX_INDEX + 1)) + if columns == 1: + set_columns(row_types.size()) + else: + assert(columns == row_types.size(), 'ошибка: %s количество колонок установлено ранее - %d, но требуется %d' % [self, columns, row_types.size()]) + var rows_count: int = get_rows_count() + assert(rows_count < MAX_INDEX, 'ошибка: слишком много рядов, больше %d' % (MAX_INDEX + 1)) + for i_col in columns: + var node = row_types[i_col].instantiate() + var head = nodes[HEAD_KEY_FORMAT % [0, i_col]] + node.custom_minimum_size.x = head.custom_minimum_size.x + node.size.x = head.size.x + var key: String = NODE_KEY_FORMAT % [rows_count, i_col] + node.name = key + add_child(node) + nodes[key] = node + node.connect('focus_entered', Callable(self, '_on_focus_entered').bind(key)) + + +func _on_focus_entered(key): + var indexes = get_key_indexes(key) + emit_signal('row_pressed', indexes[1]) + + +func set_header(header_types: Array): + assert(header_types.size() < MAX_INDEX, 'ошибка: слишком много колонок, больше %d' % (MAX_INDEX + 1)) + if columns == 1: + set_columns(header_types.size()) + else: + assert(columns == header_types.size()) + var do_adj: = false + if not header: + header = GridContainer.new() + header.position = position + header.columns = header_types.size() + header.size.x = size.x + var parent = scroll.get_parent() + parent.add_child(header) + do_adj = true + else: + var childrens = header.get_children() + for node in childrens: + childrens.erase(node.name) + childrens.remove_child(node) + node.queue_free() + for i_col in columns: + var node = header_types[i_col].instantiate() + var key: String = HEAD_KEY_FORMAT % [0, i_col] + node.name = key + nodes[key] = node + header.add_child(node) + if do_adj: + var rect = [0, 0, 0, 0] + get_node_rect(0, 0, rect, HEAD_KEY_FORMAT) + position.y += rect[3] +>>>>>>> sasha/master func set_header_text(headers: Array): @@ -332,6 +487,7 @@ func get_node_user_data(i_col: int, i_row: int) -> Object: func remove_row(i_row: int): +<<<<<<< HEAD var sel_key: String = ROW_SELECTOR_KEY_FORMAT % [i_row, 0] if nodes.has(sel_key): var selector = nodes[sel_key] @@ -355,6 +511,33 @@ func remove_row(i_row: int): var dest_node = conn[1] node.disconnect('pressed', Callable(dest_node, callback)) nodes.erase(conn_key) +======= + var sel_key: String = ROW_SELECTOR_KEY_FORMAT % [i_row, 0] + if nodes.has(sel_key): + var selector = nodes[sel_key] + var node_key: String = get_node_key(NODE_KEY_FORMAT, 0, i_row) + var node = nodes[node_key] + node.remove_child(selector) + selector.queue_free() + nodes.erase(sel_key) + for i_col in columns: + var node_key: String = get_node_key(NODE_KEY_FORMAT, i_col, i_row) + var conn_key: String = CONNECTED_KEY_FORMAT % [i_row, i_col] + var data_key: String = DATA_KEY_FORMAT % [i_row, i_col] + var node = nodes[node_key] + nodes.erase(node_key) + remove_child(node) + node.queue_free() + + if nodes.has(data_key): + nodes.erase(data_key) + if nodes.has(conn_key): + var conn = nodes[conn_key] + var callback = conn[0] + var dest_node = conn[1] + node.disconnect('pressed', Callable(dest_node, callback)) + nodes.erase(conn_key) +>>>>>>> sasha/master func rehash(swaps: Array): @@ -405,6 +588,7 @@ func clear_rows() -> void: remove_row(i_row) +<<<<<<< HEAD func set_callbacks(dest_node: Node, event_name: String, callback: String, clmns: Array, user_data: Array) -> void: """ Настраивает обратные вызовы для колонок. :dest_node: Получатель события @@ -426,6 +610,29 @@ func set_callbacks(dest_node: Node, event_name: String, callback: String, clmns: node.disconnect(event_name, Callable(prev_dest_node, prev_callback)) assert (OK == node.connect(event_name, Callable(dest_node, callback).bind([node] + user_data))) nodes[conn_key] = [callback, dest_node] +======= +func connect_columns(dest_node: Node, event_name: String, callback: String, clmns: Array, user_data: Array) -> void: + """ Настраивает обратные вызовы для колонок. + :dest_node: Получатель события + :event_name: Имя события + :callback: Имя функции получателя события + :clmns: Индексы колонок + :user_data: Аргументы функции получателя события """ + var rows_count = get_rows_count() + for i_row in rows_count: + for i_col in clmns: + assert(i_col >= 0 and i_col < columns, 'ошибка: нет колонки %d' % i_col) + var node_key: String = NODE_KEY_FORMAT % [i_row, i_col] + var conn_key: String = CONNECTED_KEY_FORMAT % [i_row, i_col] + var node = nodes[node_key] + if nodes.has(conn_key): + var conn = nodes[conn_key] + var prev_callback = conn[0] + var prev_dest_node = conn[1] + node.disconnect(event_name, Callable(prev_dest_node, prev_callback)) + assert (OK == node.connect(event_name, Callable(dest_node, callback).bind([node] + user_data))) + nodes[conn_key] = [callback, dest_node] +>>>>>>> sasha/master func set_rows_text(rows: Array) -> void: @@ -496,9 +703,17 @@ func get_row_text(i_row: int) -> Array: func set_row_text(i_row: int, row: Array, i_begin: int = 0, key_format: String = NODE_KEY_FORMAT) -> void: +<<<<<<< HEAD for i_col in columns - i_begin: var key: = get_node_key(key_format, i_col + i_begin, i_row) nodes[key].text = row[i_col] +======= + assert(i_begin >= 0) + assert((columns - i_begin) <= row.size()) + for i_col in columns - i_begin: + var key: = get_node_key(key_format, i_col + i_begin, i_row) + nodes[key].text = row[i_col] +>>>>>>> sasha/master func get_rows_text() -> Array: @@ -529,6 +744,7 @@ func get_node_rect(i_col: int, i_row: int, rect: Array, key_format: String = NOD func get_row_rect(i_row: int, rect: Array, key_format: String = NODE_KEY_FORMAT) -> void: +<<<<<<< HEAD assert(rect.size() >= 4, 'ошибка: мало элементов для возврата результата') var cell0 = nodes[get_node_key(key_format, 0, i_row)] var cell1 = nodes[get_node_key(key_format, columns - 1, i_row)] @@ -536,3 +752,12 @@ func get_row_rect(i_row: int, rect: Array, key_format: String = NODE_KEY_FORMAT) rect[1] = cell0.position.y rect[2] = (cell1.position.x - cell0.position.x) + cell1.size.x rect[3] = cell0.size.y +======= + assert(rect.size() >= 4, 'ошибка: мало элементов для возврата результата') + var cell0 = nodes[get_node_key(key_format, 0, i_row)] + var cell1 = nodes[get_node_key(key_format, columns - 1, i_row)] + rect[0] = cell0.position.x + scroll_adj.x + rect[1] = cell0.position.y + scroll_adj.y + rect[2] = (cell1.position.x - cell0.position.x) + cell1.size.x + rect[3] = cell0.size.y +>>>>>>> sasha/master From 1befd3af596aea2b19032d5d11cd2b611bec79a3 Mon Sep 17 00:00:00 2001 From: MaD_CaT Date: Tue, 25 Jul 2023 14:31:09 +0300 Subject: [PATCH 4/6] =?UTF-8?q?=D0=A2=D0=B5=D1=81=D1=82=D0=BE=D0=B2=D1=8B?= =?UTF-8?q?=D0=B9=20=D0=BA=D0=BE=D0=BC=D0=BC=D0=B8=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scenes/журнал.gd | 3 +++ scenes/работа.gd | 5 +++++ scripts/repsettings.gd | 6 ++++++ scripts/threats.gd | 3 +++ table/table.gd | 21 +++++++++++++++++++++ 5 files changed, 38 insertions(+) diff --git a/scenes/журнал.gd b/scenes/журнал.gd index 6d19807..416fc57 100644 --- a/scenes/журнал.gd +++ b/scenes/журнал.gd @@ -13,6 +13,9 @@ func _on_clear_button_down() -> void: ======= $content.clear() Log.info('Cодержание журнала очищено оператором') +<<<<<<< HEAD +>>>>>>> sasha/master +======= >>>>>>> sasha/master diff --git a/scenes/работа.gd b/scenes/работа.gd index fa9ed2a..ce778d9 100644 --- a/scenes/работа.gd +++ b/scenes/работа.gd @@ -155,6 +155,7 @@ func toggle_full_screen(id: int): func _on_full_screen(): +<<<<<<< HEAD <<<<<<< HEAD toggle_full_screen(window_1_id) toggle_full_screen(window_0_id) @@ -166,3 +167,7 @@ func _on_btn_down(signal_name: String) -> void: toggle_full_screen(window_0_id) >>>>>>> sasha/master +======= + toggle_full_screen(window_0_id) + +>>>>>>> sasha/master diff --git a/scripts/repsettings.gd b/scripts/repsettings.gd index e069f9d..1ca6155 100644 --- a/scripts/repsettings.gd +++ b/scripts/repsettings.gd @@ -1,5 +1,6 @@ extends Node +<<<<<<< HEAD <<<<<<< HEAD @export var addr: Dictionary = { \ 'уарэп-яу07-частный': ['udp', '10.1.1.160', 50160, 'IP-адрес ЯУ-07 прибора УФ'], @@ -21,6 +22,8 @@ extends Node 'уарэп-яу07-3к': ['yau07', '10.1.1.51', 50051, 'IP-адрес ЯУ-07 прибора ПРД-Н'], 'уарэп-щ3': ['uart', '/dev/stty0', 115200, 1, 1, false, 1000, 'Прибор Щ3 (скорость, стартовых, стоповых, чётность, таймаут в мкс)'] } ======= +======= +>>>>>>> sasha/master @export var addr: = { \ # Название Протокол Адрес Порт Широков. Привяз. Комментарий @@ -46,4 +49,7 @@ extends Node func _ready() -> void: Log.info('Модуль настроек готов') +<<<<<<< HEAD +>>>>>>> sasha/master +======= >>>>>>> sasha/master diff --git a/scripts/threats.gd b/scripts/threats.gd index 75717a8..1ec94e3 100644 --- a/scripts/threats.gd +++ b/scripts/threats.gd @@ -82,4 +82,7 @@ var _threats = {} func _ready() -> void: Log.info('Модуль обработки целей готов') +<<<<<<< HEAD +>>>>>>> sasha/master +======= >>>>>>> sasha/master diff --git a/table/table.gd b/table/table.gd index fb62c3c..653bfd5 100644 --- a/table/table.gd +++ b/table/table.gd @@ -106,6 +106,7 @@ func _ready(): assert(ScnNode) +<<<<<<< HEAD <<<<<<< HEAD func align_to_left_bottom(header, gap: = Vector2(0, 0)): """ Выравнивает по нижнему левому углу. @@ -113,11 +114,16 @@ func align_to_left_bottom(header, gap: = Vector2(0, 0)): position.x = header.position.x + gap.x position.y = header.position.y + header.size.y + gap.y ======= +======= +>>>>>>> sasha/master func align_to_left_bottompos(hdr: Control, gap: = Vector2(0, 0)): """ Выравнивает по нижнему левому углу. Используется для выравнивания по заголовку """ position.x = hdr.position.x + gap.x position.y = hdr.position.y + hdr.size.y + gap.y +<<<<<<< HEAD +>>>>>>> sasha/master +======= >>>>>>> sasha/master @@ -248,6 +254,9 @@ func check_event_pos(event_pos: Vector2, obj: Control): and (event_pos.x < (obj.position.x + obj.size.x)) \ and (event_pos.y > obj.position.y) \ and (event_pos.y < (obj.position.y + obj.size.y)) +<<<<<<< HEAD +>>>>>>> sasha/master +======= >>>>>>> sasha/master @@ -278,6 +287,9 @@ func default_selector_size_proc(i_row: int, rect: Array) -> void: rect[1] += position.y - node_gap.y / 2.0 rect[2] += node_gap.x rect[3] += node_gap.y +<<<<<<< HEAD +>>>>>>> sasha/master +======= >>>>>>> sasha/master @@ -349,6 +361,9 @@ func get_selected_rows(i_rows: Array) -> void: if SLCT_PREFIX in key: var indexes = get_key_indexes(key) i_rows.append(indexes[1]) +<<<<<<< HEAD +>>>>>>> sasha/master +======= >>>>>>> sasha/master @@ -588,6 +603,7 @@ func clear_rows() -> void: remove_row(i_row) +<<<<<<< HEAD <<<<<<< HEAD func set_callbacks(dest_node: Node, event_name: String, callback: String, clmns: Array, user_data: Array) -> void: """ Настраивает обратные вызовы для колонок. @@ -611,6 +627,8 @@ func set_callbacks(dest_node: Node, event_name: String, callback: String, clmns: assert (OK == node.connect(event_name, Callable(dest_node, callback).bind([node] + user_data))) nodes[conn_key] = [callback, dest_node] ======= +======= +>>>>>>> sasha/master func connect_columns(dest_node: Node, event_name: String, callback: String, clmns: Array, user_data: Array) -> void: """ Настраивает обратные вызовы для колонок. :dest_node: Получатель события @@ -703,11 +721,14 @@ func get_row_text(i_row: int) -> Array: func set_row_text(i_row: int, row: Array, i_begin: int = 0, key_format: String = NODE_KEY_FORMAT) -> void: +<<<<<<< HEAD <<<<<<< HEAD for i_col in columns - i_begin: var key: = get_node_key(key_format, i_col + i_begin, i_row) nodes[key].text = row[i_col] ======= +======= +>>>>>>> sasha/master assert(i_begin >= 0) assert((columns - i_begin) <= row.size()) for i_col in columns - i_begin: From f15f3775a9ec1024eaefd7b2239a8a8aae7ea61a Mon Sep 17 00:00:00 2001 From: MaD_CaT Date: Tue, 25 Jul 2023 14:42:52 +0300 Subject: [PATCH 5/6] =?UTF-8?q?=D0=9D=D0=B0=D1=81=D1=82=D1=80=D0=BE=D0=B9?= =?UTF-8?q?=D0=BA=D0=B0=20=D0=A1=D0=9A=D0=92?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scenes/журнал.gd | 3 +++ scenes/работа.gd | 5 +++++ scripts/repsettings.gd | 6 ++++++ scripts/threats.gd | 3 +++ table/table.gd | 21 +++++++++++++++++++++ 5 files changed, 38 insertions(+) diff --git a/scenes/журнал.gd b/scenes/журнал.gd index 416fc57..81ef5e0 100644 --- a/scenes/журнал.gd +++ b/scenes/журнал.gd @@ -14,6 +14,9 @@ func _on_clear_button_down() -> void: $content.clear() Log.info('Cодержание журнала очищено оператором') <<<<<<< HEAD +<<<<<<< HEAD +>>>>>>> sasha/master +======= >>>>>>> sasha/master ======= >>>>>>> sasha/master diff --git a/scenes/работа.gd b/scenes/работа.gd index ce778d9..f070dde 100644 --- a/scenes/работа.gd +++ b/scenes/работа.gd @@ -156,6 +156,7 @@ func toggle_full_screen(id: int): func _on_full_screen(): <<<<<<< HEAD +<<<<<<< HEAD <<<<<<< HEAD toggle_full_screen(window_1_id) toggle_full_screen(window_0_id) @@ -171,3 +172,7 @@ func _on_btn_down(signal_name: String) -> void: toggle_full_screen(window_0_id) >>>>>>> sasha/master +======= + toggle_full_screen(window_0_id) + +>>>>>>> sasha/master diff --git a/scripts/repsettings.gd b/scripts/repsettings.gd index 1ca6155..0e152e1 100644 --- a/scripts/repsettings.gd +++ b/scripts/repsettings.gd @@ -1,5 +1,6 @@ extends Node +<<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD @export var addr: Dictionary = { \ @@ -24,6 +25,8 @@ extends Node ======= ======= >>>>>>> sasha/master +======= +>>>>>>> sasha/master @export var addr: = { \ # Название Протокол Адрес Порт Широков. Привяз. Комментарий @@ -50,6 +53,9 @@ extends Node func _ready() -> void: Log.info('Модуль настроек готов') <<<<<<< HEAD +<<<<<<< HEAD +>>>>>>> sasha/master +======= >>>>>>> sasha/master ======= >>>>>>> sasha/master diff --git a/scripts/threats.gd b/scripts/threats.gd index 1ec94e3..3b7d9d6 100644 --- a/scripts/threats.gd +++ b/scripts/threats.gd @@ -82,7 +82,10 @@ var _threats = {} func _ready() -> void: Log.info('Модуль обработки целей готов') +<<<<<<< HEAD <<<<<<< HEAD >>>>>>> sasha/master ======= >>>>>>> sasha/master +======= +>>>>>>> sasha/master diff --git a/table/table.gd b/table/table.gd index 653bfd5..69496b9 100644 --- a/table/table.gd +++ b/table/table.gd @@ -106,6 +106,7 @@ func _ready(): assert(ScnNode) +<<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD func align_to_left_bottom(header, gap: = Vector2(0, 0)): @@ -116,12 +117,17 @@ func align_to_left_bottom(header, gap: = Vector2(0, 0)): ======= ======= >>>>>>> sasha/master +======= +>>>>>>> sasha/master func align_to_left_bottompos(hdr: Control, gap: = Vector2(0, 0)): """ Выравнивает по нижнему левому углу. Используется для выравнивания по заголовку """ position.x = hdr.position.x + gap.x position.y = hdr.position.y + hdr.size.y + gap.y <<<<<<< HEAD +<<<<<<< HEAD +>>>>>>> sasha/master +======= >>>>>>> sasha/master ======= >>>>>>> sasha/master @@ -255,6 +261,9 @@ func check_event_pos(event_pos: Vector2, obj: Control): and (event_pos.y > obj.position.y) \ and (event_pos.y < (obj.position.y + obj.size.y)) <<<<<<< HEAD +<<<<<<< HEAD +>>>>>>> sasha/master +======= >>>>>>> sasha/master ======= >>>>>>> sasha/master @@ -288,6 +297,9 @@ func default_selector_size_proc(i_row: int, rect: Array) -> void: rect[2] += node_gap.x rect[3] += node_gap.y <<<<<<< HEAD +<<<<<<< HEAD +>>>>>>> sasha/master +======= >>>>>>> sasha/master ======= >>>>>>> sasha/master @@ -362,6 +374,9 @@ func get_selected_rows(i_rows: Array) -> void: var indexes = get_key_indexes(key) i_rows.append(indexes[1]) <<<<<<< HEAD +<<<<<<< HEAD +>>>>>>> sasha/master +======= >>>>>>> sasha/master ======= >>>>>>> sasha/master @@ -603,6 +618,7 @@ func clear_rows() -> void: remove_row(i_row) +<<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD func set_callbacks(dest_node: Node, event_name: String, callback: String, clmns: Array, user_data: Array) -> void: @@ -629,6 +645,8 @@ func set_callbacks(dest_node: Node, event_name: String, callback: String, clmns: ======= ======= >>>>>>> sasha/master +======= +>>>>>>> sasha/master func connect_columns(dest_node: Node, event_name: String, callback: String, clmns: Array, user_data: Array) -> void: """ Настраивает обратные вызовы для колонок. :dest_node: Получатель события @@ -722,12 +740,15 @@ func get_row_text(i_row: int) -> Array: func set_row_text(i_row: int, row: Array, i_begin: int = 0, key_format: String = NODE_KEY_FORMAT) -> void: <<<<<<< HEAD +<<<<<<< HEAD <<<<<<< HEAD for i_col in columns - i_begin: var key: = get_node_key(key_format, i_col + i_begin, i_row) nodes[key].text = row[i_col] ======= ======= +>>>>>>> sasha/master +======= >>>>>>> sasha/master assert(i_begin >= 0) assert((columns - i_begin) <= row.size()) From 8dc842d8a316a131cba2854f8064e152f7ca071b Mon Sep 17 00:00:00 2001 From: MaD_CaT Date: Tue, 25 Jul 2023 14:44:56 +0300 Subject: [PATCH 6/6] =?UTF-8?q?=D0=9D=D0=B0=D1=81=D1=82=D1=80=D0=BE=D0=B9?= =?UTF-8?q?=D0=BA=D0=B0=20=D0=A1=D0=9A=D0=92?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scenes/журнал.gd | 3 +++ scenes/работа.gd | 5 +++++ scripts/repsettings.gd | 6 ++++++ scripts/threats.gd | 3 +++ table/table.gd | 21 +++++++++++++++++++++ 5 files changed, 38 insertions(+) diff --git a/scenes/журнал.gd b/scenes/журнал.gd index 81ef5e0..03f017f 100644 --- a/scenes/журнал.gd +++ b/scenes/журнал.gd @@ -15,6 +15,9 @@ func _on_clear_button_down() -> void: Log.info('Cодержание журнала очищено оператором') <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD +>>>>>>> sasha/master +======= >>>>>>> sasha/master ======= >>>>>>> sasha/master diff --git a/scenes/работа.gd b/scenes/работа.gd index f070dde..68cdb17 100644 --- a/scenes/работа.gd +++ b/scenes/работа.gd @@ -157,6 +157,7 @@ func toggle_full_screen(id: int): func _on_full_screen(): <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD <<<<<<< HEAD toggle_full_screen(window_1_id) toggle_full_screen(window_0_id) @@ -176,3 +177,7 @@ func _on_btn_down(signal_name: String) -> void: toggle_full_screen(window_0_id) >>>>>>> sasha/master +======= + toggle_full_screen(window_0_id) + +>>>>>>> sasha/master diff --git a/scripts/repsettings.gd b/scripts/repsettings.gd index 0e152e1..5b46ca1 100644 --- a/scripts/repsettings.gd +++ b/scripts/repsettings.gd @@ -3,6 +3,7 @@ extends Node <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD @export var addr: Dictionary = { \ 'уарэп-яу07-частный': ['udp', '10.1.1.160', 50160, 'IP-адрес ЯУ-07 прибора УФ'], 'уарэп-яу07-общий': ['udp', '10.1.1.255', 50000, 'IP-адрес для приёма широковещательных пакетов от ЯУ-07'], @@ -27,6 +28,8 @@ extends Node >>>>>>> sasha/master ======= >>>>>>> sasha/master +======= +>>>>>>> sasha/master @export var addr: = { \ # Название Протокол Адрес Порт Широков. Привяз. Комментарий @@ -54,6 +57,9 @@ func _ready() -> void: Log.info('Модуль настроек готов') <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD +>>>>>>> sasha/master +======= >>>>>>> sasha/master ======= >>>>>>> sasha/master diff --git a/scripts/threats.gd b/scripts/threats.gd index 3b7d9d6..dda08ac 100644 --- a/scripts/threats.gd +++ b/scripts/threats.gd @@ -82,6 +82,7 @@ var _threats = {} func _ready() -> void: Log.info('Модуль обработки целей готов') +<<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD >>>>>>> sasha/master @@ -89,3 +90,5 @@ func _ready() -> void: >>>>>>> sasha/master ======= >>>>>>> sasha/master +======= +>>>>>>> sasha/master diff --git a/table/table.gd b/table/table.gd index 69496b9..0f5bb92 100644 --- a/table/table.gd +++ b/table/table.gd @@ -109,6 +109,7 @@ func _ready(): <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD func align_to_left_bottom(header, gap: = Vector2(0, 0)): """ Выравнивает по нижнему левому углу. Используется для выравнивания по заголовку """ @@ -119,6 +120,8 @@ func align_to_left_bottom(header, gap: = Vector2(0, 0)): >>>>>>> sasha/master ======= >>>>>>> sasha/master +======= +>>>>>>> sasha/master func align_to_left_bottompos(hdr: Control, gap: = Vector2(0, 0)): """ Выравнивает по нижнему левому углу. Используется для выравнивания по заголовку """ @@ -126,6 +129,9 @@ func align_to_left_bottompos(hdr: Control, gap: = Vector2(0, 0)): position.y = hdr.position.y + hdr.size.y + gap.y <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD +>>>>>>> sasha/master +======= >>>>>>> sasha/master ======= >>>>>>> sasha/master @@ -262,6 +268,9 @@ func check_event_pos(event_pos: Vector2, obj: Control): and (event_pos.y < (obj.position.y + obj.size.y)) <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD +>>>>>>> sasha/master +======= >>>>>>> sasha/master ======= >>>>>>> sasha/master @@ -298,6 +307,9 @@ func default_selector_size_proc(i_row: int, rect: Array) -> void: rect[3] += node_gap.y <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD +>>>>>>> sasha/master +======= >>>>>>> sasha/master ======= >>>>>>> sasha/master @@ -375,6 +387,9 @@ func get_selected_rows(i_rows: Array) -> void: i_rows.append(indexes[1]) <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD +>>>>>>> sasha/master +======= >>>>>>> sasha/master ======= >>>>>>> sasha/master @@ -621,6 +636,7 @@ func clear_rows() -> void: <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD func set_callbacks(dest_node: Node, event_name: String, callback: String, clmns: Array, user_data: Array) -> void: """ Настраивает обратные вызовы для колонок. :dest_node: Получатель события @@ -647,6 +663,8 @@ func set_callbacks(dest_node: Node, event_name: String, callback: String, clmns: >>>>>>> sasha/master ======= >>>>>>> sasha/master +======= +>>>>>>> sasha/master func connect_columns(dest_node: Node, event_name: String, callback: String, clmns: Array, user_data: Array) -> void: """ Настраивает обратные вызовы для колонок. :dest_node: Получатель события @@ -741,6 +759,7 @@ func get_row_text(i_row: int) -> Array: func set_row_text(i_row: int, row: Array, i_begin: int = 0, key_format: String = NODE_KEY_FORMAT) -> void: <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD <<<<<<< HEAD for i_col in columns - i_begin: var key: = get_node_key(key_format, i_col + i_begin, i_row) @@ -749,6 +768,8 @@ func set_row_text(i_row: int, row: Array, i_begin: int = 0, key_format: String = ======= >>>>>>> sasha/master ======= +>>>>>>> sasha/master +======= >>>>>>> sasha/master assert(i_begin >= 0) assert((columns - i_begin) <= row.size())