From ce096cfcb7134fa8d714af8a1d11da63b62897f3 Mon Sep 17 00:00:00 2001 From: f1iwq2 Date: Fri, 17 Apr 2020 15:59:50 +0200 Subject: [PATCH] V1.6 --- UnitConfig.dcu | Bin 11959 -> 12342 bytes UnitConfig.dfm | 36 +- UnitConfig.pas | 28 +- UnitConfigTCO.dcu | Bin 6005 -> 7258 bytes UnitConfigTCO.dfm | 52 +- UnitConfigTCO.pas | 102 ++- UnitDebug.dcu | Bin 13168 -> 13181 bytes UnitPilote.dcu | Bin 10725 -> 10741 bytes UnitPrinc.dcu | Bin 181748 -> 190575 bytes UnitPrinc.dfm | 343 ++++---- UnitPrinc.pas | 1016 ++++++++++++++--------- UnitSimule.dcu | Bin 7693 -> 7693 bytes UnitTCO.dcu | Bin 61249 -> 94460 bytes UnitTCO.dfm | 1087 ++++++++++++++----------- UnitTCO.pas | 1971 +++++++++++++++++++++++++++++++++------------ config.cfg | 205 +++-- configgily.cfg | 21 +- verif_version.dcu | Bin 9120 -> 9468 bytes verif_version.pas | 15 +- versions.txt | 5 +- 20 files changed, 3164 insertions(+), 1717 deletions(-) diff --git a/UnitConfig.dcu b/UnitConfig.dcu index a10affde7938092541a3a954792d56395153cadf..46fd33be20bb94effb37eecc9317ae27f3931844 100644 GIT binary patch delta 3904 zcmZ`*4RBP|6~5=(-Itqn6L!~4*knT74Iz`pkV(>*1_m*I1ml1vkWgTZxNhEtC;P|l zOC~sNH(JApAr4{vfljf-u^n-o4jBLHFb;O0^*O*uD{XDXq8%M+D}vP-Y<1If-^(9p zleyqm|E|mX82t=5O?rdHszXmS4O}0K>snX~1$DBUw-B1R<@*c5 zxjk)L)zG%q`0yhGjsKl^{5IEsqh^*H{NkB&N6t4mZLJL-znJmmt+zFtKK)`Qp7&__ z?NEbQtEN)H0X4;bPm}dKQoXtsNwJeO*$_->!I++6Z-yFj+9JVJimZ;&!s=u&u~iGD z*sC<5n)GCxTuq|HOv-7pUhlUij!?Sc>IN`d zsKQy(BZF9-8hP&1#h;h3s_W))51j}eahLiXb5o&2a{V=TF_@%n@l=mlAB1z^>`?rj?Av-+&&nc zZ-O=TVLxlgmA9r{y=QQM?ZS{X?MiB~5L=6(%3L)z6xX)UR!0ttul~VWY&Ks2Qen>( zzp_qE4My}rpW?UcwEa|}R|!>$M1*#_Me83KKKGzt*MDI1SoVu&>^*y3MLlJHD+p+& zm#s4q-^Lj5Z;LK%nBSI&rxIlBhgjHq$#0L#X2}IbO(v-uVQ(htTA2Qp-C-&i_FVGA zz0%rDIOp?msM0s@1Z6jyPe|8f);}K;6+j=z;E-V!RWxX2fSCfS< zG$YN+e#NXP|B^qqZEG+#pi;{UeHpj=`qjRR{@jqs^{#IX`~LN_VNqQ*bT_0gO;17*&Dj?3Ah#exy-KJyWetonEG0d_dxFU!2<_7#+cp3JUhf|Z`i z@8}W+=Ck+nPE7vO{W7Ghb5|$hg9&=wH+k_$UbWkN?DP@P!qZ;@uk-c1YL`iO#=`Mg z_DtSV=lq^|FGjhTp{$y`7bheoA5%+6*M@?+>b-b?i%>gl#=n5RMhznirlzLSUCpFN zPTjhOVE&JdCe6UuI&QJ!gu{F?;PpVJ)+@N5?VoHccnfZcmwt3U0{#~xE&6Dp24g+t%__=_m1T+hHTEH&_ zq@NM+tbp4EtP$`l0X+f^3wT_>J^?=w@KXUX0W|_16i_RmUO9v7prj@I`}4Z@je>eSc<0|T+hcL2M?l` z7QD1jYNCpz=l3W@yhKJ#7x7xW;^I;C;a6VF7DLgriC0;|y|9F` z_F^&KOc}fBSk9n>I0qJ>A1p5lvmQVsl?}9 zSjRo27UBz5$ED*LYGSqopO0yzrqkmx*VY3s?`IU@eU%8pTL=h|)R8L8g}blNZvuGwI8;pP36J z_cnKd3h{oLk76ZPs=3IAQ#2bcCU4mk>u4_6l?jeG>`)Hy63XSGC*`AVP;*@7)qJZ2 zUvN@#laQ$_;vI|l5FKHYalwV@wJg5m$5$RUQ!b}y(+A*F4)J_AM8UtteCz%?s2y~T z9kMhD^7emLOg400E(L95>CC}Bn=k;;1(`dlKIhf8>P+j6H>Pb>SZzz#j?-a>_JKpnI-4W&!W+owm%atayapn&LIZ8cdi-I9R=beq;^wxk1)wU^%iT z11pd%H|R026$VxzTWQcmWz7cGAZs~;fJ zAnP)4C9-t}HY4kaa;DfeZs_9%wx*G7n2__$8%J#hwj8ojKUPTrRlY}2`D!jJZ%s7W^Nf-l?wu delta 3570 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 Y-k?#z19Xl9d{oH{agDqxO34EM0W%9CxBvhE diff --git a/UnitConfig.dfm b/UnitConfig.dfm index 70647c7..320ebb8 100644 --- a/UnitConfig.dfm +++ b/UnitConfig.dfm @@ -2,7 +2,7 @@ object FormConfig: TFormConfig Left = 316 Top = 238 Width = 598 - Height = 340 + Height = 382 Caption = 'Configuration g'#233'n'#233'rale' Color = clBtnFace Font.Charset = DEFAULT_CHARSET @@ -16,7 +16,7 @@ object FormConfig: TFormConfig TextHeight = 13 object Label6: TLabel Left = 128 - Top = 248 + Top = 288 Width = 332 Height = 13 Caption = @@ -41,7 +41,7 @@ object FormConfig: TFormConfig Left = 8 Top = 8 Width = 265 - Height = 89 + Height = 81 Caption = 'CDM Rail' TabOrder = 0 object Label1: TLabel @@ -151,7 +151,7 @@ object FormConfig: TFormConfig end object Button1: TButton Left = 112 - Top = 272 + Top = 312 Width = 105 Height = 25 Caption = 'Appliquer et Fermer' @@ -160,7 +160,7 @@ object FormConfig: TFormConfig end object GroupBox3: TGroupBox Left = 8 - Top = 104 + Top = 96 Width = 265 Height = 105 Caption = 'Acc'#232's r'#233'seau '#224' l'#39'interface vers la centrale LENZ' @@ -246,11 +246,35 @@ object FormConfig: TFormConfig end object Button2: TButton Left = 352 - Top = 272 + Top = 312 Width = 113 Height = 25 Caption = 'Fermer sans appliquer' TabOrder = 5 OnClick = Button2Click end + object GroupBox5: TGroupBox + Left = 8 + Top = 208 + Width = 265 + Height = 57 + Caption = 'Versions du programme' + TabOrder = 6 + object CheckVerifVersion: TCheckBox + Left = 8 + Top = 16 + Width = 249 + Height = 17 + Caption = 'V'#233'rifications de nouvelle version au d'#233'marrage' + TabOrder = 0 + end + object CheckInfoVersion: TCheckBox + Left = 8 + Top = 32 + Width = 241 + Height = 17 + Caption = 'Information sur la version actuelle' + TabOrder = 1 + end + end end diff --git a/UnitConfig.pas b/UnitConfig.pas index 8bab1df..cd19fa0 100644 --- a/UnitConfig.pas +++ b/UnitConfig.pas @@ -4,7 +4,7 @@ interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, - Dialogs, ExtCtrls, StdCtrls ; + Dialogs, ExtCtrls, StdCtrls , verif_version ; type TFormConfig = class(TForm) @@ -37,6 +37,9 @@ type Label10: TLabel; Label11: TLabel; Label12: TLabel; + GroupBox5: TGroupBox; + CheckVerifVersion: TCheckBox; + CheckInfoVersion: TCheckBox; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure FormActivate(Sender: TObject); @@ -260,15 +263,15 @@ begin if changeInterface then begin if AdresseIP<>'0' then + begin + Affiche('demande connexion à la centrale Lenz par Ethernet',clyellow); + With Formprinc do begin - Affiche('demande connexion à la centrale Lenz par Ethernet',clyellow); - With Formprinc do - begin - ClientSocketLenz.port:=port; - ClientSocketLenz.Address:=AdresseIP; - ClientSocketLenz.Open; - end; - end + ClientSocketLenz.port:=port; + ClientSocketLenz.Address:=AdresseIP; + ClientSocketLenz.Open; + end; + end end; if changeUSB then @@ -276,6 +279,9 @@ begin deconnecte_USB; connecte_USB; end; + + verifVersion:=CheckVerifVersion.Checked; + notificationVersion:=CheckInfoVersion.Checked; formConfig.close; end; @@ -305,6 +311,10 @@ begin if Valeur_entete=0 then RadioButton1.checked:=true; if Valeur_entete=1 then RadioButton2.checked:=true; if Valeur_entete=2 then RadioButton3.checked:=true; + + CheckVerifVersion.Checked:=verifVersion; + CheckInfoVersion.Checked:=notificationVersion; + end; end. diff --git a/UnitConfigTCO.dcu b/UnitConfigTCO.dcu index b8f2818429aee33f9e7a3da36265bb3ccf22af6a..9434d773657a1dd96d77e2ea5a426116625aa9f8 100644 GIT binary patch delta 3529 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 diff --git a/UnitConfigTCO.dfm b/UnitConfigTCO.dfm index 9314153..e52c26b 100644 --- a/UnitConfigTCO.dfm +++ b/UnitConfigTCO.dfm @@ -1,7 +1,7 @@ object FormConfigTCO: TFormConfigTCO Left = 542 Top = 389 - Width = 405 + Width = 360 Height = 251 Caption = 'Configuration du TCO' Color = clBtnFace @@ -11,7 +11,7 @@ object FormConfigTCO: TFormConfigTCO Font.Name = 'MS Sans Serif' Font.Style = [] OldCreateOrder = False - OnCreate = FormCreate + OnActivate = FormActivate PixelsPerInch = 96 TextHeight = 13 object Label1: TLabel @@ -42,34 +42,14 @@ object FormConfigTCO: TFormConfigTCO Height = 13 Caption = 'Nombre de cellules en vertical:' end - object LabelNbCellX: TLabel - Left = 192 - Top = 52 - Width = 96 - Height = 20 - Caption = 'LabelNbCellX' - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -16 - Font.Name = 'MS Sans Serif' - Font.Style = [] - ParentFont = False - end - object LabelNbCellY: TLabel - Left = 192 - Top = 76 - Width = 96 - Height = 20 - Caption = 'LabelNbCellX' - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -16 - Font.Name = 'MS Sans Serif' - Font.Style = [] - ParentFont = False + object LabelErreur: TLabel + Left = 35 + Top = 144 + Width = 3 + Height = 13 end object ButtonOK: TButton - Left = 168 + Left = 240 Top = 176 Width = 75 Height = 25 @@ -110,4 +90,20 @@ object FormConfigTCO: TFormConfigTCO Caption = 'dessine grille' TabOrder = 4 end + object EditNbCellX: TEdit + Left = 184 + Top = 56 + Width = 49 + Height = 21 + TabOrder = 5 + Text = 'EditNbCellX' + end + object EditNbCellY: TEdit + Left = 184 + Top = 80 + Width = 49 + Height = 21 + TabOrder = 6 + Text = 'EditNbCellY' + end end diff --git a/UnitConfigTCO.pas b/UnitConfigTCO.pas index 506c3e8..46488d6 100644 --- a/UnitConfigTCO.pas +++ b/UnitConfigTCO.pas @@ -15,13 +15,14 @@ type Label2: TLabel; Label3: TLabel; Label4: TLabel; - LabelNbCellX: TLabel; - LabelNbCellY: TLabel; ButtonDessine: TButton; CheckDessineGrille: TCheckBox; + EditNbCellX: TEdit; + EditNbCellY: TEdit; + LabelErreur: TLabel; procedure ButtonOKClick(Sender: TObject); - procedure FormCreate(Sender: TObject); procedure ButtonDessineClick(Sender: TObject); + procedure FormActivate(Sender: TObject); private { Déclarations privées } public @@ -38,50 +39,85 @@ uses UnitPrinc; {$R *.dfm} -procedure TFormConfigTCO.ButtonOKClick(Sender: TObject); -var i,erreur : integer; +function verif_config_TCO : boolean; // renvoie true si ok +var erreur : integer; + nokNbX,nokNbY,nokHt,nokLg : boolean; begin - Val(EditTailleCellX.Text,i,erreur); - LargeurCell:=i; - Val(EditTailleCellY.Text,i,erreur); - HauteurCell:=i; - with formTCO do + with formConfigTCO do begin - ImageTCO.Width:=LargeurCell*NbreCellX; - ImageTCO.Height:=HauteurCell*NbreCellY; - end; - AvecGrille:=checkDessineGrille.Checked; - formTCO.affiche_TCO; - close; -end; + Val(EditNbCellX.Text,NbreCellX,erreur); + nokNbX:=erreur<>0; + if nokNbX then LabelErreur.caption:='Erreur nombre de cellules X'; + nokNbX:=(NbreCellX<20) or (NbreCellX>MaxCellX); + if nokNbX then LabelErreur.caption:='Erreur: nombre de cellules X: mini=20 maxi='+IntToSTR(MaxCellX); -procedure TFormConfigTCO.FormCreate(Sender: TObject); -begin - EditTailleCellX.Text:=IntToSTR(LargeurCell); - EditTailleCellY.Text:=IntToSTR(HauteurCell); - LabelNbCellX.Caption:=IntToSTR(NbreCellX); - LabelNbCellY.Caption:=IntToSTR(NbreCellY); + Val(EditNbCellY.Text,NbreCellY,erreur); + nokNbY:=erreur<>0; + if nokNbY then LabelErreur.caption:='Erreur: nombre de cellules Y'; + nokNbY:=nokNbY or (NbreCellY<10) or (NbreCellY>MaxCellY); + if nokNbY then LabelErreur.caption:='Erreur: nombre de cellules Y: mini=10 maxi='+IntToSTR(MaxCellY); + + Val(EditTailleCellX.Text,LargeurCell,erreur); + nokLg:=erreur<>0; + if nokLg then LabelErreur.caption:='Erreur largeur de cellules'; + nokLg:=nokLg or (LargeurCell<20) or (LargeurCell>50) ; + if nokLg then LabelErreur.caption:='Erreur: Tailles des cellules - largeur cellules mini=20 maxi=50'; + Val(EditTailleCellY.Text,HauteurCell,erreur); + nokHt:=erreur<>0; + if nokHt then LabelErreur.caption:='Erreur hauteur de cellules'; + nokHt:=nokHt or (HauteurCell<20) or (HauteurCell>50) ; + if nokHt then LabelErreur.caption:='Erreur: Tailles des cellules - hauteur cellules mini=20 maxi=50'; + + AvecGrille:=checkDessineGrille.Checked; + end; + verif_config_TCO:=not(nokNbX or nokNbY or nokHt or nokLg); end; - +procedure TFormConfigTCO.ButtonOKClick(Sender: TObject); +var i : integer; + +begin + if verif_config_TCO then + begin + with formTCO do + begin + ImageTCO.Width:=LargeurCell*NbreCellX; + ImageTCO.Height:=HauteurCell*NbreCellY; + end; + AvecGrille:=checkDessineGrille.Checked; + formTCO.affiche_TCO; + LabelErreur.caption:=''; + close; + end; +end; procedure TFormConfigTCO.ButtonDessineClick(Sender: TObject); var i,erreur : integer; r : Trect; c : tCanvas; begin - - Val(EditTailleCellX.Text,i,erreur); - LargeurCell:=i; - Val(EditTailleCellY.Text,i,erreur); - HauteurCell:=i; - with formTCO do + if verif_config_TCO then begin - ImageTCO.Width:=LargeurCell*NbreCellX; - ImageTCO.Height:=HauteurCell*NbreCellY; + with formTCO do + begin + ImageTCO.Width:=LargeurCell*NbreCellX; + ImageTCO.Height:=HauteurCell*NbreCellY; + end; + formTCO.affiche_TCO; end; - formTCO.affiche_TCO; +end; + + + + +procedure TFormConfigTCO.FormActivate(Sender: TObject); +begin + EditTailleCellX.Text:=IntToSTR(LargeurCell); + EditTailleCellY.Text:=IntToSTR(HauteurCell); + EditNbCellX.Text:=IntToSTR(NbreCellX); + EditNbCellY.Text:=IntToSTR(NbreCellY); + checkDessineGrille.Checked:=AvecGrille; end; end. diff --git a/UnitDebug.dcu b/UnitDebug.dcu index 3216e9093efdace5cee2e0f424c124662ce46ea8..9ebeabcec21729e4a88746cea142548fe561806c 100644 GIT binary patch delta 224 zcmey6_BW0DJ_7@PtuX_`!VMEPa-ZO1aWZ+ab@O$;hmwpxHt*D6;b3H#yx%}swpfw5 zl9_>t;X^Hm{L}~{zjT7gn0SdX+YZ@$j=P?GV_=A9ZW988XXChs#)mONF- z%)rF(p%z4bY6OvAIzc4EFBuAPFKl zSrkDOn<|KuWzhstiY$g8iop~_+OpV!C?`h{8Oh=amhlCVxh$a|>O~}oY-C9UQP)yI fn{3GyE>aS188! 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%0D1y~J4&FtzZa#YDs z+m7o$*NeqULa~EDq?HVIhSX=N!mCw~0%$e6P!o2-K(HR&eQ@L#VRuDmB5Eo-s@j6_ z!#~Z6h8>g#dhBZ-dn}woX)86@d1KLCSBD*yYm=(yst~||SSJFmBrz9ukn8&QUH|uq zumgLx_J&8kxgcU++!>+-btHQk#W4KnT)1pWQ(ZOZ*$WqnxrRc*AFU-=7^!=ZRO5fy z{Ahk8Zy~u7DETrq{N{I8ogZ;A03PL~$JTu>Vn@KpLF=s&Sj3nDkqXdAx zl6^^BNK|w{&X}g|nwhqnA`X9dG)Zm3ZX*?U-)C$y;DlM&*bcB0uB?1=J4QoZysB$$ zU;jO&V2(<4;Gfy?F#AMZC`sEN3Z_Mzv@LJ%WUlfTQi0})R4V_a-SGMh>5M=B-GPYR z9}7$F@kB~;`z61hjy_u!FKI-UgFA7G1&8r+AY0naoY=f73B^$pDvu=M230&0g=H6i zuR4;;&Vn*U+|0R<%c2S^u1Rk8YE`J=6sd0&oon^QkNeMCSdCRxz)X`+)zQVJ$qThb zODD{5j}8~T5ip!vPZmW}F*TlwL|kGtD$i9Ii;Y`P1`gb-z5zemHdCu3z1vTW67V3~HID&Y0bD~~ABn{}aMpMZd1H6Ih%wQ@oRjwJBRLc*pzvbn zuO5XHm8IFW!Bs7Q&fWj`-bikBG#pMP5DcknK6f>SCXsfyc0WpKW?B5&XRo|Bl7~hu z9kEuVyi~%DOiBb(Yt$BGz}li}yd@cmk<3CWpPJ&FBh{|zLddHKha01`m+DAy<3b|M zNSr=fT~YN_*|I*`9!nZ6b62**wYP-YqbF#Y$>t*O5}a$IaL-9vU?RDzf~iiGuy`?Y zt-;QlO0QF8K|)2i+=jFefq3b25W*l6QSP4ljSWaM8-P{cxqpLp!YWXfUT0q& zafuBn8TJDW;Z98=)(GWwFm%od9>7or<_21AVz@FxhNIMl8$wX z_;q1{y)C7-RR4)eIij*AJQ)opw<6|2R-`4YrdqmqhQwqSK#0>U*>P&El>dROnv{R z8*%;+>~6u%EZUi1L!L}!K_2}vxiwc~5()^elYEorB^$%4K?(=P>t;#u5W>5^g&_zz zF`#zYg&z#fXDRWuhn{FOywDb!uSMd@8}`tAJyKWxn@ZXaMfoo(X}cli^C)RMG^LNK zv|YI}l}d8!pHS9$p~@Xh zQyj=Dozz$!;VP?8&<>TAThN6(b5?F5EO{oc)KEbl-z$}1iSG<3R|1TT5nm`!=7;86 zuP!K;hUU9d&?$@tmp>FoXqFVG5Z`$>Rcv0PTq;D)pbhh1eDQnTGqaP?WL({N$)(@R ztG6u}!T+XW#bG^6b^AitjJB)YYQlGYz^BY~A^z=(VHw!C80LM4qCAi_(}_8*2!%G1 znck@=S-zP$v^HR98%Z~S)H*YJQIg6FMY$tuW?qQWmMyLESTwnjJOj`iIur>$btAb5 zKy5RNBrZX(r>h?u$qk~)X{oB_DxH?c)C1R$TSOz}gDyW#z-fTLU4O1}@m&vGeyIxy z61eO(b;FL|+3)J&wYHR9gvNYbLU*J9wcVk;Z!!ZiIR=b zLzFR&MdRuQPuCBV>t{MSgQ#x&%FizP>b=y$)v8L+R|Uv+slBnbVnd+p+h^|eorB(S z{h}p_D;%*F3aWzbRbB1f$KvZQ*uSC4?kgmo$AC|%Sfhq$n^K`OoH$0-9av%a@oXXd zjp~pb%;!oNu@1ljA6GG--8#gL`$cgTxr>Ae3(Ep!T@6Tn9SFr$k);%EZ?^k#H4Y^? zfC{k{CdszolniUHjyi?UX~(H_LeEobyN+B)vxW66k&3Rtse=wLAnp-hgi)|UowLV2M#0V>S$D&r7_!7=V)GV3oI3v zi~x�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

B^ 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 ny6Y}^#h!$t0 then - case feux[i].aspect of - // feux de signalisation - 2 : dessine_feu2(Feux[i].Img.Canvas,0,0,1,1,EtatSignalCplx[adresse],1); - 3 : dessine_feu3(Feux[i].Img.Canvas,0,0,1,1,EtatSignalCplx[adresse],1); - 4 : dessine_feu4(Feux[i].Img.Canvas,0,0,1,1,EtatSignalCplx[adresse],1); - 5 : dessine_feu5(Feux[i].Img.Canvas,0,0,1,1,EtatSignalCplx[adresse],1); - 7 : dessine_feu7(Feux[i].Img.Canvas,0,0,1,1,EtatSignalCplx[adresse],1); - 9 : dessine_feu9(Feux[i].Img.Canvas,0,0,1,1,EtatSignalCplx[adresse],1); - // indicateurs de direction - 12 : dessine_dir2(Feux[i].Img.Canvas,EtatSignalCplx[adresse]); - 13 : dessine_dir3(Feux[i].Img.Canvas,EtatSignalCplx[adresse]); - 14 : dessine_dir4(Feux[i].Img.Canvas,EtatSignalCplx[adresse]); - 15 : dessine_dir5(Feux[i].Img.Canvas,EtatSignalCplx[adresse]); - 16 : dessine_dir6(Feux[i].Img.Canvas,EtatSignalCplx[adresse]); - end; -end; - Procedure TFormprinc.ImageOnClick(Sender : Tobject); var s : string; P_image_pilote : Timage; @@ -1756,7 +1760,6 @@ begin // signalisation combinée - rappel 30 + avertissement - à tester...... if (Combine=0) then pilote_acc(adresse+2,1,feu) ; // éteindre rappel 30 if (Combine=rappel_30) then pilote_acc(adresse+2,2,feu) ; // allumer rappel 30 - Dessine_feu_mx(Feux[Index_Feu(adresse)].Img.Canvas,0,0,1,1,adresse,1); end; end; @@ -1834,7 +1837,6 @@ begin if ((Combine=rappel_60) and (aspect=jaune)) then envoi5_LEB($10); if ((Combine=rappel_60) and (aspect=jaune_cli)) then envoi5_LEB($11); if ((Combine=ral_60) and (aspect=jaune_cli)) then envoi5_LEB($12); - Dessine_feu_mx(Feux[Index_Feu(adr)].Img.Canvas,0,0,1,1,adr,1); end; end; @@ -1921,7 +1923,6 @@ begin if (Combine=rappel_60) and (aspect=jaune_cli) then valeur:=18; pilote_acc(adresse,valeur,feu); - Dessine_feu_mx(Feux[Index_Feu(adresse)].Img.Canvas,0,0,1,1,adresse,1); end; end; @@ -2219,7 +2220,6 @@ begin end; if (code=jaune) and (combine=rappel_60) then pilote_acc(adresse+3,1,feu); end; - Dessine_feu_mx(Feux[Index_Feu(adresse)].Img.Canvas,0,0,1,1,adresse,1); end; end; @@ -2277,7 +2277,6 @@ begin if (aspect=rappel_60) then begin pilote_acc(adr+3,2,feu);sleep(tempoFeu);pilote_acc(adr+1,2,feu);end; end; end; - Dessine_feu_mx(Feux[Index_Feu(adr)].Img.Canvas,0,0,1,1,adr,1); end; end; @@ -2293,7 +2292,6 @@ begin aspect:=code_to_aspect(code); // transforme le motif de bits en numéro "code des aspects des signaux" if (tracesign) then Affiche('Signal virtuel: ad'+intToSTR(adresse)+'='+etatSign[aspect],clOrange); if AffSignal then AfficheDebug('Signal virtuel: ad'+intToSTR(adresse)+'='+etatSign[aspect],clOrange); - Dessine_feu_mx(Feux[Index_Feu(adresse)].Img.Canvas,0,0,1,1,adresse,1); end; end; @@ -2304,7 +2302,6 @@ envoie les donn adressant l'une des 14 adresses pour les 14 leds possibles du feu. Ici on met le bit 1 à 1 (état "vert" du programme hexmanipu ===========================================================================*) -//procedure envoi_signalBahn(adresse,codebin : integer); procedure envoi_signalBahn(adresse : integer); var aspect,combineLoc,codebin : integer; ralrap, jau ,Ancralrap,Ancjau : boolean; @@ -2365,7 +2362,7 @@ begin sleep(40); pilote_ACC(adresse+CombineLoc,2,feu) ; end; - Dessine_feu_mx(Feux[Index_Feu(adresse)].Img.Canvas,0,0,1,1,adresse,1); + end; end; @@ -3224,10 +3221,13 @@ end; // de la proc // pilotage d'un signal procedure envoi_signal(Adr : integer); -var i : integer; +var i,adresse,a,aspect,x,y,TailleX,TailleY,Orientation : integer; + ImageFeu : TImage; + frX,frY : real; begin i:=index_feu(Adr); - if feux[i].aspect<10 then + if feux[i].aspect<10 then + begin case feux[i].decodeur of 0 : envoi_virtuel(Adr); 1 : envoi_signalBahn(Adr); @@ -3236,7 +3236,52 @@ begin 4 : envoi_LEB(Adr); 5 : envoi_NMRA(Adr); 6 : envoi_UniSemaf(Adr); - end; + end; + // dessine le feu dans la fenêtre de droite + Dessine_feu_mx(Feux[i].Img.Canvas,0,0,1,1,adresse,1); + + // dessine le feu du TCO + if AvecTCO then + begin + for i:=1 to NbFeuTCO do + begin + adresse:=FeuTCO[i].adresse; + if adresse<>0 then + begin + a:=EtatsignalCplx[adresse]; // a = état binaire du feu + aspect:=feuTCO[i].aspect; + case aspect of + 2 : ImageFeu:=Formprinc.Image2feux; + 3 : ImageFeu:=Formprinc.Image3feux; + 4 : ImageFeu:=Formprinc.Image4feux; + 5 : ImageFeu:=Formprinc.Image5feux; + 7 : ImageFeu:=Formprinc.Image7feux; + 9 : ImageFeu:=Formprinc.Image9feux; + else ImageFeu:=Formprinc.Image3feux; + end; + x:=(FeuTCO[i].x-1)*LargeurCell; // coordonnées XY et feu + y:=(FeuTCO[i].y-1)*HauteurCell; + TailleY:=ImageFeu.picture.BitMap.Height; // taille du feu d'origine (verticale) + TailleX:=ImageFeu.picture.BitMap.Width; + Orientation:=FeuTCO[i].FeuOriente; + // réduction variable en fonction de la taille des cellules + calcul_reduction(frx,fry,round(TailleX*LargeurCell/ZoomMax),round(tailleY*HauteurCell/ZoomMax),TailleX,TailleY); + + // décalage en X pour mettre la tete du feu alignée sur le bord droit de la cellule pour les feux tournés à 90G + if orientation=2 then + begin + if aspect=9 then x:=x+round(10*frX); + if aspect=7 then x:=x+round(10*frX); + if aspect=5 then begin x:=x+round(10*frX);y:=y+HauteurCell-round(tailleX*frY); end; + if aspect=4 then begin x:=x+round(10*frX);y:=y+HauteurCell-round(tailleX*frY); end; + if aspect=3 then begin x:=x+round(10*frX);y:=y+HauteurCell-round(tailleX*frY); end; + if aspect=2 then begin x:=x+round(10*frX);y:=y+HauteurCell-round(tailleX*frY); end; + end; + Dessine_feu_mx(PCanvasTCO,x,y,frx,fry,adresse,orientation); + end; + end; + end; + end; end; // pilotage des signaux @@ -3408,7 +3453,7 @@ begin val(s,TimoutMaxInterface,erreur); if erreur<>0 then Affiche('Erreur temporisation maximale interface',clred); - //entete + // entete s:=lit_ligne; val(s,Valeur_entete,erreur); entete:=''; @@ -3420,7 +3465,7 @@ begin if (erreur<>0) or (valeur_entete>2) then Affiche('Erreur déclaration variable entete',clred); - //avec ou sans initialisation des aiguillages + // avec ou sans initialisation des aiguillages s:=lit_ligne; AvecInitAiguillages:=StrToINT(s); @@ -3431,31 +3476,66 @@ begin j:=pos(',',s); if j>1 then begin - adresse:=StrToINT(copy(s,1,j-1));Delete(s,1,j); // adresse aiguillage - if (adresse>0) then begin - j:=pos(',',s); - position:=StrToInt(copy(s,1,j-1));Delete(S,1,j);// position aiguillage - if (position<1) or (position>2) then position:=1; - aiguillage[adresse].position:=position; - aiguillageB[adresse].position:=position; + adresse:=StrToINT(copy(s,1,j-1));Delete(s,1,j); // adresse aiguillage + if (adresse>0) and (AvecInitAiguillages=1) then + begin + j:=pos(',',s); + position:=StrToInt(copy(s,1,j-1));Delete(S,1,j);// position aiguillage + if (position<1) or (position>2) then position:=1; + aiguillage[adresse].position:=position; + aiguillageB[adresse].position:=position; - // temporisation aiguillage - j:=pos(',',s);if j=0 then j:=length(s); - val(s,temporisation,erreur);Delete(S,1,j); - if (temporisation<0) or (temporisation>10) then temporisation:=5; - aiguillage[adresse].temps:=temporisation; - aiguillageB[adresse].temps:=temporisation; - - val(s,invers,erreur); - if (invers<0) or (invers>1) then invers:=0; // inversion commande - aiguillage[adresse].inversion:=invers; - aiguillageB[adresse].inversion:=invers; - + // temporisation aiguillage + j:=pos(',',s);if j=0 then j:=length(s); + val(s,temporisation,erreur);Delete(S,1,j); + if (temporisation<0) or (temporisation>10) then temporisation:=5; + aiguillage[adresse].temps:=temporisation; + aiguillageB[adresse].temps:=temporisation; + + val(s,invers,erreur); + if (invers<0) or (invers>1) then invers:=0; // inversion commande + aiguillage[adresse].inversion:=invers; + aiguillageB[adresse].inversion:=invers; + end; end; end; until (adresse=0); + + // vérification de la version au démarrage + verifVersion:=true; + s:=lit_ligne; + val(s,i,erreur); + if erreur=0 then verifVersion:=i=1; + + // notification de nouvelle version au démarrage + s:=lit_ligne; + val(s,i,erreur); + notificationVersion:=i=1; + // avec tco + s:=lit_ligne; + val(s,i,erreur); + AvecTCO:=i=1; + + // lancement de CDM + s:=lit_ligne; + val(s,i,erreur); + LanceCDM:=i=1; + + // Nom du LAY + Lay:=Lit_Ligne; + + // Serveur d'interface de CDM + s:=lit_ligne; + val(s,i,erreur); + ServeurInterfaceCDM:=i; + + // Serveur de rétrosignalisation de CDM + s:=lit_ligne; + val(s,i,erreur); + ServeurRetroCDM:=i; + closefile(fichier); Affiche('lecture du fichier de configuration config.cfg',clyellow); @@ -3810,7 +3890,10 @@ begin else // feu de signalisation begin - feux[i].aspect:=StrToInt(sa);Delete(s,1,j); + k:=StrToInt(sa); //aspect + feux[i].aspect:=k;Delete(s,1,j); + if (k=0) or (k=6) or (k>9) then + Affiche('Fichier config.cfg: configuration aspect ('+intToSTR(k)+') feu incorrecte à la ligne '+chaine,clRed); j:=pos(',',s); if j>1 then begin Feux[i].FeuBlanc:=(copy(s,1,j-1))='1';delete(s,1,j);end; j:=pos(',',s); @@ -4106,7 +4189,7 @@ begin end; // trouve un élément dans les branches, renvoie branche_trouve IndexBranche_trouve -// el : adresse de l'élément TypeEL=(1=détécteur 2=aig 3=aig Bis) +// el : adresse de l'élément TypeEL=(1=détécteur 2=aig 3=aig Bis 4=aig triple) procedure trouve_element(el : integer;TypeEl : integer); var i,Btype,adr,Branche : integer ; s : string; @@ -4122,9 +4205,12 @@ begin if ((adr=0) and (Btype=0)) then begin inc(Branche);i:=0;end; inc(i); sort:=(Branche>NbreBranches) or + ((adr=el) and (TypeEl=5) and (Btype=3)) or //typeEl=5=aig bis + ((adr=el) and (TypeEl=4) and (Btype=2)) or //typeEl=4=aig triple ((adr=el) and (TypeEl=3) and (Btype=3)) or ((adr=el) and (TypeEl=2) and (Btype=2)) or - ((adr=el) and (TypeEl=1) and (Btype=1)) ; + ((adr=el) and (TypeEl=1) and (Btype=1)) or + ((adr=el) and (TypeEl=1) and (Btype=4)) ; //buttoir until (sort); if (adr=el) then begin @@ -4323,12 +4409,12 @@ begin begin if prec<>aiguillage[Adr].Adevie then begin - if NivDebug=3 then AfficheDebug('Aiguillage '+intToSTR(adr)+' mal positionné',clyellow); + if NivDebug=3 then AfficheDebug('135.3 Aiguillage '+intToSTR(adr)+' mal positionné',clyellow); suivant_alg3:=9998;exit; end else begin - if NivDebug=3 then AfficheDebug('Aiguillage '+intToSTR(adr)+' bien positionné',clyellow); + if NivDebug=3 then AfficheDebug('135.4 Aiguillage '+intToSTR(adr)+' bien positionné',clyellow); end; end; end; @@ -4778,7 +4864,7 @@ begin trouve_element(adresse,1); // branche_trouve IndexBranche_trouve if (IndexBranche_trouve=0) then begin - Affiche('élément '+IntToSTR(adresse)+' non trouvé',clred); + Affiche('Erreur 380 : élément '+IntToSTR(adresse)+' non trouvé',clred); exit; end; IndexBranche:=IndexBranche_trouve; @@ -4834,7 +4920,9 @@ begin trouve_element(el1,Typedet1); // branche_trouve IndexBranche_trouve if (IndexBranche_trouve=0) then begin - Affiche('élément '+IntToSTR(el1)+' non trouvé',clred); + s:='Erreur 381 : élément '+IntToSTR(el1)+' non trouvé'; + Affiche(s,clred); + if NivDebug=3 then AfficheDebug(s,clred); detecteur_suivant_El:=1;exit; end; IndexBranche_det1:=IndexBranche_trouve; @@ -4844,7 +4932,9 @@ begin trouve_element(el2,TypeDet2); // branche_trouve IndexBranche_trouve if (IndexBranche_trouve=0) then begin - Affiche('élément '+IntToSTR(el2)+' non trouvé',clred); + s:='Erreur 382 : élément '+IntToSTR(el2)+' non trouvé'; + Affiche(s,clred); + if NivDebug=3 then AfficheDebug(s,clred); detecteur_suivant_El:=2;exit; end; @@ -5469,7 +5559,7 @@ end; // mise à jour de l'état d'un feu en fontion de son environnement et affiche le feu procedure Maj_Feu(Adrfeu : integer); var i,j,k1,k2,BtypeSuiv,Adr_det,etat,Adr,Aig,DetPrec1,DetPrec2,Detprec3,Detprec4,Adr_El_Suiv, - Btype_el_suivant,det_initial,bt,el_suiv,modele : integer ; + Btype_el_suivant,det_initial,bt,el_suiv,modele,code : integer ; PresTrain,Aff_semaphore,car : boolean; s : string; begin @@ -5494,8 +5584,15 @@ begin // signal non directionnel etat:=etat_signal_suivant(AdrFeu,1) ; // état du signal suivant + adresse du signal suivant dans Signal_Suivant - if AffSignal then AfficheDebug('Etat signal suivant ('+intToSTR(AdresseFeuSuivant)+') est '+intToSTR(etat),clyellow); - + if AffSignal then + begin + code:=code_to_aspect(etat); + s:='Etat signal suivant ('+intToSTR(AdresseFeuSuivant)+') est '; + s:=s+' à '+etatSign[code]; + if Combine<>0 then s:=s+' + '+etatSign[combine]; + AfficheDebug(s,clyellow); + end; + // signaux traités spécifiquement if (AdrFeu=201) then begin @@ -5587,7 +5684,15 @@ begin if AffSignal then AfficheDebug('les détecteurs précédents au feu '+IntToSTR(Adrfeu)+' sont:'+intToSTR(Det_initial)+' '+intToSTR(DetPrec1)+' '+intToSTR(DetPrec2)+' '+intToSTR(DetPrec3)+' ',clyellow); PresTrain:=//MemZone[DetPrec4,detPrec3] or MemZone[DetPrec3,detPrec2] or MemZone[DetPrec2,detPrec1] or MemZone[DetPrec1,Det_initial] or presTrain ; - // Affiche('MemZone'+intToSTR(DetPrec3)+' '+IntToSTR(detPrec2) = '+MemZone[DetPrec3,detPrec2] + if AffSignal then + begin + if MemZone[DetPrec3,detPrec2] then AfficheDebug('1.présence train '+IntToSTR(DetPrec3)+' '+IntToSTR(detPrec2),clyellow); + if MemZone[DetPrec2,detPrec1] then AfficheDebug('2.présence train '+IntToSTR(DetPrec2)+' '+IntToSTR(detPrec1),clyellow); + if MemZone[DetPrec1,det_initial] then AfficheDebug('3.présence train '+IntToSTR(DetPrec1)+' '+IntToSTR(det_Initial),clyellow); + + //if PresTrain then AfficheDebug('présence train',clyellow) else afficheDebug('abscence train',clyellow); + end; + //if AffSignal then AfficheDebug('MemZone'+intToSTR(DetPrec3)+' '+IntToSTR(detPrec2) = '+MemZone[DetPrec3,detPrec2] end; end; end; @@ -5688,12 +5793,6 @@ begin end end; -// met à jour le signal adr dont le détecteur vient d'être franchi dans le bon sens -procedure signal(SignalCplx,detecteurAct,detecteurSuiv : integer); -begin - if MemZone[detecteurAct,detecteurSuiv] then if testBit(EtatSignalCplx[signalCplx],carre)=FALSE then Maj_Etat_Signal(signalCplx,semaphore); -end; - // trouve l'index d'un détecteur dans une branche depuis la fin de la branche // si pas trouvé, renvoie 0 function index_detecteur_fin(det,Num_branche : integer) : integer; @@ -5733,8 +5832,8 @@ end; // calcul des zones depuis le tableau des fronts descendants des évènements détecteurs // transmis dans le tableau Event_det -procedure calcul_zones_V2; -var Nbre,Nouveau_Det,i,resultat,det1,det2,det3,AdrSuiv : integer ; +procedure calcul_zones; +var AdrFeu,AdrDetFeu,Nbre,Nouveau_Det,i,resultat,det1,det2,det3,AdrSuiv,TypeSuiv,AdrPrec : integer ; creer_tableau : boolean; s : string; begin @@ -5838,6 +5937,27 @@ begin Affiche('Erreur nombre de train maximal atteint',clRed); end; Inc(N_trains); + + // vérifier si le détecteur du nouveau train est associé à un feu vers un buttoir + for i:=1 to NbreFeux do + begin + AdrFeu:=Feux[i].Adresse; + AdrDetfeu:=Feux[i].Adr_Det1; + if (AdrDetFeu=Det3) and (feux[i].aspect<10) then + begin + AdrSuiv:=Feux[i].Adr_el_suiv1;TypeSuiv:=Feux[i].Btype_suiv1; + AdrPrec:=detecteur_suivant(AdrSuiv,typeSuiv,AdrDetFeu,1) ; // détecteur précédent le feu + if AdrPrec=0 then + begin + if TraceListe then Affiche('FD - Le feu '+IntToSTR(AdrFeu)+' est précédé d''un buttoir',clyellow); + MemZone[0,AdrDetFeu]:=false; + //NivDebug:=3; + AffSignal:=true; + maj_feu(AdrFeu); + end; + end; + end; + if TraceListe then AfficheDebug('Création Train n°'+intToSTR(i),clyellow); Formprinc.LabelNbTrains.caption:=IntToSTR(N_trains); event_det_train[N_trains].det[1]:=det3; @@ -5855,78 +5975,6 @@ begin end; -// calcul des zones depuis le tableau des fronts descendants des évènements détecteurs -// transmis dans le tableau Event_det -// appellé par front descendant sur détecteur -// met à jour le tableau MemZone -(* plus utilisé -procedure calcul_zones ; -var i,det1,det2,index_1,index_2,index_3,resultat : integer; - unevalide : boolean; - s : string; - label refaire; -begin - uneValide:=false; - //N_event_det pointe sur le dernier détecteur - refaire: - - affiche_Event_det; - - if N_event_det<2 then begin exit;end; // pas assez de détecteurs pour évaluer - // balayer index 1 à 2 puis 1 à 3 puis 1 à N_event_det et ensuite - // de 2 à 3 puis de 2 à 4 puis de 2 à 5 etc - index_1:=1; - repeat - index_2:=index_1+1; - repeat - //det0:=event_det[index_ - det1:=event_det[index_1]; - det2:=event_det[index_2]; - //if det1=det2 then // si détecteurs identiques, supprimer le 2eme - //begin - // if traceListe then AfficheDebug('trouvé doublon ('+intToSTR(dat1)+')',clyellow); - // supprime_event(index_2); - // //if traceListe then for index_3:=1 to N_event_det do affiche(intToSTR(event_det[index_3]),clyellow); - // goto refaire; - //end; - - if det2=detecteur_chgt then // on cherche la route pour le 2eme détecteur qui vient de changer - begin - if traceListe then - begin - AfficheDebug('-------Cherche route de '+intToSTR(det1)+' à '+intToSTR(det2)+' i1='+intToSTR(index_1)+' i2='+intToSTR(index_2)+' n='+intToSTR(N_event_det),clyellow); - end; - resultat:=calcul_zones_det(det1,det2); - if resultat=10 then - begin - s:='route traitée de '+intToSTR(det1)+' à '+IntToSTR(det2)+' Mem '+intToSTR(det2)+' à '+IntToSTR(El_suivant); - FormDebug.MemoEvtDet.lines.add(s); - if traceListe then AfficheDebug(s,clyellow); - uneValide:=true; - FormDebug.MemoEvtDet.lines.add('Nouveau Tampon:'); - if traceListe then AfficheDebug('Nouveau Tampon',clyellow); - affiche_Event_det; - end; - - // détecteur1 non trouvé - if resultat=1 then begin supprime_event(index_1);goto refaire;end; - // détecteur2 non trouvé - if resultat=2 then begin supprime_event(index_2);goto refaire;end; - - end; - inc(index_2); - //Affiche('index2='+IntToSTR(index_2),clyellow); - until (index_2>N_event_det); - inc(index_1); - until (index_1>=N_event_det); - // si on a trouvé au moins une route valide, rafraichir les signaux - if uneValide then - begin - rafraichit; - rafraichit; - rafraichit; - end; -end; *) // demande l'état d'un accessoire à la centrale. Le résultat sera réceptionné sur réception des informations // de rétrosignalisation. @@ -6023,13 +6071,14 @@ end; // traitement sur les évènements détecteurs procedure Event_Detecteur(Adresse : integer;etat : boolean); -var i,trainAdj1,TrainAdj2,TrainActuel,Etat01 : integer; +var i,AdrSuiv,AdrFeu,AdrDetfeu,TrainActuel,Etat01,typeSuiv,AdrPrec : integer; s : string; begin if Etat then Etat01:=1 else Etat01:=0; // vérifier si l'état du détecteur est déja stocké, car on peut reçevoir plusieurs évènements pour le même détecteur dans le même état // on reçoit un doublon dans deux index consécutifs. +(* if N_Event_tick>=1 then begin if (event_det_tick[N_event_tick].etat=etat01) and (event_det_tick[N_event_tick].detecteur=Adresse) then @@ -6038,7 +6087,7 @@ begin exit; // déja stocké end; end; - + *) if Traceliste then AfficheDebug('--------------------- détecteur '+intToSTR(Adresse)+' à '+intToSTR(etat01)+'-----------------------------',clOrange); if AffAigDet then begin @@ -6056,20 +6105,48 @@ begin // stocke les changements d'état des détecteurs dans le tableau chronologique if (N_Event_tickAdresse then + //if event_det[N_event_det]<>Adresse then begin if AffFD then AfficheDebug('index='+intToSTR(N_event_tick)+' FD '+intToSTR(Adresse),clyellow); inc(N_event_det); @@ -6082,13 +6159,15 @@ begin if aiguillage[i].modele<>0 then begin if aiguillage[i].position=9 then - Affiche('Attention : position de l''aiguillage '+IntToSTR(i)+' inconnue',clred); - AfficheDebug('Attention : position de l''aiguillage '+IntToSTR(i)+' inconnue',clred); + begin + Affiche('Attention : position de l''aiguillage '+IntToSTR(i)+' inconnue',clred); + AfficheDebug('Attention : position de l''aiguillage '+IntToSTR(i)+' inconnue',clred); + end; end; end; end; premierFD:=True; - if not(configNulle) then calcul_zones_V2; // en avant les calculs + if not(configNulle) then calcul_zones; // en avant les calculs end; end; @@ -6104,7 +6183,7 @@ begin // Mettre à jour le TCO if AvecTCO then begin - formTCO.Maj_TCO(Adresse,etat); + formTCO.Maj_TCO(Adresse); end; end; @@ -6144,10 +6223,8 @@ begin begin if pos=const_devie then aiguillageB[adresse].position:=const_droit; if pos=const_droit then aiguillageB[adresse].position:=const_devie; - end; - // ------------- stockage évènement aiguillage dans tampon event_det_tick ------------------------- if (N_Event_tickconst_droit then - begin - Adet:=aiguillage[adresse].Adevie; - if aiguillage[adresse].AdevieB='Z' then Btype:=1 else Btype:=2; - end; - - if Btype<>1 then - begin - BtypeE:=Btype; - AdresseE:=Adresse; - i:=0; - repeat - // trouver le détecteur avant l'aiguillage - attention prévoir aiguillage BIS (btype=3) - Det_Suiv:=suivant_alg3(adresseE,BtypeE,Adet,Btype,1) ; - adresseE:=Adet; BtypeE:=Btype; - Adet:=Det_Suiv;Btype:=TypeGen; - inc(i); - until (typeGen=1) or (i>20); - end; - if (i>20) then begin Affiche('Erreur 671',clRed);exit;end; - Affiche('le détecteur suivant sur aiguillage '+intToSTR(adresse)+' est '+intToSTR(Adet),clyellow); - - // étape 2 : trouver si un train est sur le détecteur dans le tableau event_det_tick - i:=N_Event_tick; - repeat - dec(i); - trouve:=event_det_tick[i].detecteur[Adet]=1; // si le détecteur à rechercher en amont de la liste est à "etat" - //train:=event_det_tick[i].train; - index:=i; - until trouve or (i=1); - if trouve then - begin - Affiche('détecteur '+intToSTR(Adet)+' à 1',clyellow); - // il y a a un train dessus, - det_adj(Adet); // trouver les détecteurs adjacents (adj1 et adj2) - Affiche('Adj1='+intToSTR(Adj1)+' Adj2='+intToSTR(Adj2),clyellow); - // trouver le détecteur adjacent - i:=N_Event_tick; - trouve1:=false;trouve2:=false; - repeat - dec(i); - if not(trouve1) then - begin - trouve1:=event_det_tick[i].detecteur[Adj1]=1;index1:=i; // si le détecteur - train1:=event_det_tick[index1].train; - end; - if not(trouve2) then - begin - trouve2:=event_det_tick[i].detecteur[Adj2]=1;index2:=i; - train2:=event_det_tick[index2].train; - end; // si le détecteur à rechercher en amont de la liste est à 1 - until (trouve1 and trouve2) or (i=1); - - if not(trouve1) and not(trouve2) then affiche('pas trouve adj1 ni adj2 à 1',clOrange); - if trouve1 and (train1=train) then - begin - Affiche(' détecteur Adj1='+intToSTR(Adj1)+' train='+intToSTR(train),clyellow); - event_det_tick[index1].suivant:=Adet; - event_det_tick[index].suivant:=Adj2; - - end; - if trouve2 and (train2=train) then - begin - Affiche(' détecteur Adj2='+intToSTR(Adj2)+' train='+intToSTR(train),clyellow); - event_det_tick[index2].suivant:=Adet; - event_det_tick[index].suivant:=Adj1; - end; - - - end; - } + end; -// le décodage de la rétro est appellée sur une réception d'une trame de la rétrosignalisation. -// On déclenche ensuite le rafraichissement +// le décodage de la rétro est appellée sur une réception d'une trame de la rétrosignalisation de la centrale. +// On déclenche ensuite les évènements détecteurs ou aiguillages. procedure decode_retro(adresse,valeur : integer); var s : string; adraig,bitsITT,i : integer; @@ -6380,7 +6380,7 @@ begin end; -// décodage d'une chaine simple de la rétrosignalisation +// décodage d'une chaine simple de la rétrosignalisation de la centrale function decode_chaine_retro(chaineINT : string) : string ; var msg : string; i,cvLoc : integer; @@ -6568,12 +6568,12 @@ end; // vérifie si version OS32 bits ou OS64 bits function IsWow64Process: Boolean; type - TIsWow64Process = function(hProcess: THandle; var Wow64Process: Boolean): Boolean; stdcall; + TIsWow64Process=function(hProcess: THandle; var Wow64Process: Boolean): Boolean; stdcall; var DLL: THandle; pIsWow64Process: TIsWow64Process; const - IsWow64: Boolean = False; + IsWow64: Boolean=False; begin IsWow64:=false; DLL:=LoadLibrary('kernel32.dll'); @@ -6590,9 +6590,9 @@ begin end; {$J-} +// initialisation de la comm USB procedure connecte_USB; begin -// initialisation de la comm USB if NumPort<>0 then begin With Formprinc.MSCommUSBLenz do @@ -6643,12 +6643,230 @@ begin end; +Function GetWindowFromID(ProcessID : Cardinal): THandle; +Var TestID : Cardinal; + TestHandle : Thandle; +Begin + Result:=0; + TestHandle:=FindWindowEx(GetDesktopWindow,0,Nil,Nil); + while TestHandle>0 do + begin + if GetParent(TestHandle)=0 then GetWindowThreadProcessId(TestHandle,@TestID); + if TestID=ProcessID then + begin + Result:=TestHandle; + exit; + end; + TestHandle:=GetWindow(TestHandle,GW_HWNDNEXT) + end; +end; + +// renvoie si un process EXE tourne. Renvoie le Handle du process dans CDMHd et l'Id du process dans ProcessID +// sExeName : Nom de l'EXE sans le chemin, et sans EXE } +function ProcessRunning(sExeName: String) : Boolean; +var + hSnapShot : THandle; + ProcessEntry32 : TProcessEntry32; // pointeur sur la structure ProcessEntry32 + processID : DWord; +begin + Result:=false; + + hSnapShot:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); + Win32Check(hSnapShot <> INVALID_HANDLE_VALUE); + + sExeName:=LowerCase (sExeName); + + FillChar(ProcessEntry32,SizeOf(TProcessEntry32),#0); + ProcessEntry32.dwSize:=SizeOf(TProcessEntry32); // contient la structure de tous les process + + if (Process32First(hSnapShot,ProcessEntry32)) then + repeat + //Affiche(ProcessEntry32.szExeFile,ClYellow); + if (Pos(sExeName,LowerCase(ProcessEntry32.szExeFile))=1) then + begin + processID:=ProcessEntry32.th32ProcessID; + CDMhd:=GetWindowFromID(processID); + Affiche('CDM rail processID='+IntToSTR(ProcessID)+' handle='+IntToSTR(CDMhd),clOrange); + Result:=true; + Break; + end; + until (Process32Next(hSnapShot,ProcessEntry32)=false); + CloseHandle(hSnapShot); +end; + +procedure SendKey(Wnd,VK : Cardinal; Ctrl,Alt,Shift : Boolean); +var + MC,MA,MS : Boolean; +begin + // Met la fenetre de destination en arrière + //ShowWindow(Wnd,SW_SHOW); + //SetForegroundWindow(Wnd); + + //if VK=ord('\') then Vk:=58; // * + + + // Etats des touches spéciales + MC:=Hi(GetAsyncKeyState(VK_CONTROL))>127; + MA:=Hi(GetAsyncKeyState(VK_MENU))>127; + MS:=Hi(GetAsyncKeyState(VK_SHIFT))>127; + + // Simulation des touches de contrôle + if Ctrl<>MC then keybd_event(VK_CONTROL,0,Byte(MC)*KEYEVENTF_KEYUP,0); + if Alt<>MA then keybd_event(VK_MENU,0,Byte(MA)*KEYEVENTF_KEYUP,0); + if Shift<>MS then keybd_event(VK_SHIFT,0,Byte(MS)*KEYEVENTF_KEYUP,0); + + // Appui sur les touches + keybd_event(VK,0,0,0); + keybd_event(VK,0,KEYEVENTF_KEYUP,0); + +// keybd_event(MapVirtualKeyA(VK,0),0,0,0); +// keybd_event(MapVirtualKeyA(VK,0),0,KEYEVENTF_KEYUP,0); + + // Release modifier keys if necessary + if Ctrl<>MC then keybd_event(VK_CONTROL,0,Byte(Ctrl)*KEYEVENTF_KEYUP,0); + if Alt<>MA then keybd_event(VK_MENU,0,Byte(Alt)*KEYEVENTF_KEYUP,0); + if Shift<>MS then keybd_event(VK_SHIFT,0,Byte(Shift)*KEYEVENTF_KEYUP,0); +end; + +// conversion d'une chaine standard en chaîne VK (virtual key) pour envoyer des évènements clavier +// 112=F1 .. 135=F20 136 à 143 rien 145 à 159 : spécifique ou non utilisé +// $A0 .. $B0 : contrôles curseur +// $BA : spécifique au pays +// $6A à $6F * + espace - . / +// BB à BE + - . attention la description diffère +function convert_VK(LAY : string) : string; +var i : integer; + s : string; +begin + s:=''; + for i:=1 to Length(Lay) do + begin + case Lay[i] of + '0' : s:=s+#96 ; + '1' : s:=s+'a'; + '2' : s:=s+'b'; + '3' : s:=s+'c'; + '4' : s:=s+'d'; + '5' : s:=s+'e'; + '6' : s:=s+'f'; + '7' : s:=s+'g'; + '8' : s:=s+'h'; + '9' : s:=s+'i'; + '*' : s:=s+#$6a; + '+' : s:=s+#$6b; + // ' ' : s:=s+#$6c; + '-' : s:=s+#$6d; + '.' : s:=s+#$6e; + '/' : s:=s+#$6f; + '_' : s:=s+'{8}'; + // '\' : s:=s+#$e2; + 'a'..'z' : s:=s+Upcase(lay[i]); + ' ','A'..'Z',#8..#$D : s:=s+lay[i]; + else Affiche('Erreur de conversion VK : '+lay,clred); + end; + end; + convert_VK:=s; +end; + +// en sortie si Lance_CDM=true, il a été lancé, sinon il était déja lancé. +function Lance_CDM : boolean; +var i : integer; + s : string; +begin + s:='CDR'; + if (ProcessRunning(s)) then begin Lance_CDM:=false;exit;end; + + Affiche('Lancement de CDM',clyellow); + if ShellExecute(Formprinc.Handle, + 'open',PChar('C:\Program Files (x86)\CDM-Rail\cdr.exe'), + //'open',Pchar('notepad'), + Pchar(''), // paramètre + PChar('C:\Program Files (x86)\CDM-Rail\') // répertoire + ,SW_SHOWNORMAL)<=32 then + begin + ShowMessage(SysErrorMessage(GetLastError)); + Lance_CDM:=false;exit; + end + + else + begin + Sleep(1000); + // démarre le serveur IP : Alt C , return 2 fois + SendKey(CDMHd,ord('C'),false,true,false); + SendKey(CDMHd,VK_RETURN,false,false,false); + SendKey(CDMHd,VK_RETURN,false,false,false); + Sleep(100); + Application.ProcessMessages; + + // Ouvre le fichier réseau : Alt F , Return, O, return + SendKey(CDMHd,ord('F'),false,true,false); + SendKey(CDMHd,VK_RETURN,false,false,false); + SendKey(CDMHd,ord('O'),false,false,false); + SendKey(CDMHd,VK_RETURN,false,false,false); + Sleep(200); // attendre ouverture de la fenêtre + Application.ProcessMessages; + + // ouvre le fichier réseau + + Affiche('Ouvre '+Lay,clyellow); + s:=convert_VK(LAY); + Sleep(100); + for i:=1 to length(s) do + SendKey(CDMHd,ord(s[i]),false,false,false); + SendKey(CDMHd,VK_return,false,false,false); + Sleep(2000); + Application.ProcessMessages; + + // Serveur d'interface + if ServeurInterfaceCDM>0 then + begin + // ALT I 2 fois , Return + SendKey(CDMHd,ord('I'),false,true,false); // Avec Alt + SendKey(CDMHd,ord('I'),false,false,false); // Sans Alt + SendKey(CDMHd,VK_RETURN,false,false,false); // Ouvre le menu + SendKey(CDMHd,VK_RETURN,false,false,false); // Affiche le serveur d'interfaces + Sleep(100); + + // descendre le curseur n fois + for i:=1 to ServeurInterfaceCDM-1 do + begin + SendKey(CDMHd,VK_DOWN,false,false,false); + end; + // 2x TAB pour pointer sur OK + SendKey(CDMHd,VK_TAB,false,false,false); + SendKey(CDMHd,VK_TAB,false,false,false); + SendKey(CDMHd,VK_RETURN,false,false,false); + Sleep(100); + + // Rétrosignalisation + if (ServeurInterfaceCDM=1) or (ServeurInterfaceCDM=7) then + begin + for i:=1 to ServeurRetroCDM-1 do + begin + SendKey(CDMHd,VK_DOWN,false,false,false); + end; + // 3x TAB pour pointer sur OK + SendKey(CDMHd,VK_TAB,false,false,false); + SendKey(CDMHd,VK_TAB,false,false,false); + SendKey(CDMHd,VK_TAB,false,false,false); + SendKey(CDMHd,VK_RETURN,false,false,false); + Sleep(100); + end; + end; + Sleep(100); + SendKey(CDMHd,VK_return,false,false,false); // renvoyer un CR + Lance_CDM:=true; + Application.ProcessMessages; + end; +end; + procedure TFormPrinc.FormCreate(Sender: TObject); var i,j : integer; s,s2,Url,LocalFile : string; trouve,AvecMaj : Boolean; V_utile : real; + CibleHandle : Thandle; begin //AvecMaj:=false; TraceSign:=True; @@ -6673,9 +6891,9 @@ begin TempoAct:=0; DebugOuv:=True; - AvecInit:=true; //&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& - AvecTCO:=false; - + AvecInit:=false; //&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& + Diffusion:=true; + // créée la fenetre vérification de version FormVersion:=TformVersion.Create(Self); @@ -6686,24 +6904,16 @@ begin AffMem:=true; N_routes:=0; N_trains:=0; - // Train[1].index:=0; + ButtonAffTCO.visible:=AvecTCO; + // Train[1].index:=0; - // lecture fichier de configuration config.cfg + // lecture fichier de configuration client_GL.cfg et config.cfg lit_config; + + // lancer CDM rail si on le demande + if LanceCDM then Lance_CDM; + - // TCO - if avectco then - begin - //créée la fenêtre TCO - FormTCO:=TformTCO.Create(Self); - FormTCO.show; - //construit_TCO; - //affiche_TCO; - //Formprinc.Hide; - end; - - - // tenter la liaison vers CDM rail ou vers la centrale Lenz //Affiche('Test présence CDM',clYellow); connecte_CDM; @@ -6771,38 +6981,21 @@ begin N_Event_tick:=0 ; // dernier index NombreImages:=0; + // TCO + if avectco then + begin + //créée la fenêtre TCO + FormTCO:=TformTCO.Create(Self); + FormTCO.show; + end; + //essai - //maj_feu(201); -// formdebug.Show; - //AfficheDet:=true; - //NivDebug:=3; - //Aiguille_deviee(462); - //aiguillageB[1].Position:=1; - //i:=suivant_alg3(553,1,1,3,1); - //Affichedebug(intToSTr(i),clred); - //Affiche(IntToSTR(calcul_zones_det(522,514)),clyellow); - - //i:=detecteur_suivant_El(514,1,518,1); // donne l'élément suivant de AdrPrec à AdrFonc et dans Bis si c'est un aig bis - //i:=etat_signal_suivant(1001,1); - // Affiche(IntToSTR(detecteur_suivant(25,2,529,1)),clyellow); - //i:=Aiguille_deviee(176); - //signal_direction(372); - //FormDebug.show; - //test_memoire_zones(218); - //Det_Adj(520); - //Affiche(' Adj1='+intToStr(Adj1)+' Adj2='+intToStr(Adj2),clyellow); - //trace:=true; - //TraceListe:=true; - //interprete_reponse(#$FF+#$FD+#$46+#$43+#$40+#$41+#$40+#$40+#$49+#$4D); Affiche('Fin des initialisations',clyellow); - - //Menu_interface(valide); - //s:=#$f0; - //s:=checksum(s); - //envoi(s); - //id_cdm:='01'; - //envoie_fonction_CDM(0,1,'train'); - //i:=ShellExecute(handle,PChar('open'),PChar('C:\Program Files (x86)\CDM-Rail\cdr.exe'),nil,nil,SW_SHOWNORMAL); + LabelEtat.Caption:=' '; + + // SendMessage(CDMHd, WM_MENUCOMMAND,9001,0); + // SendMessage(CDMHd, WM_COMMAND,9001,9001); + // SendMessage(CDMHd, WM_MENUSELECT,9001,9001); end; @@ -6810,7 +7003,6 @@ end; procedure TFormPrinc.MSCommUSBLenzComm(Sender: TObject); var i : integer; begin - //trace:=true; if MSCommUSBLenz.commEvent=comEvReceive then begin TpsRecuCom:=0; @@ -6833,6 +7025,9 @@ begin portCommOuvert:=false; ClientSocketCDM.close; ClientSocketLenz.close; + if TCO_modifie then + if MessageDlg('Le TCO a été modifié. Voulez vous le sauvegarder ?',mtConfirmation,[mbYes,mbNo],0)=mrYes then + sauve_fichier_tco; end; @@ -6860,11 +7055,9 @@ begin end; - - // timer à 100 ms procedure TFormPrinc.Timer1Timer(Sender: TObject); -var index,aspect,i,a,x,y,adresse,TailleX,TailleY : integer; +var index,aspect,i,a,x,y,adresse,TailleX,TailleY,orientation : integer; imageFeu : Timage; frx,fry : real; s : string; @@ -6911,40 +7104,51 @@ begin end; end; + // feux du TCO if avecTCO then begin + // parcourir les feux du TCO for i:=1 to NbFeuTCO do begin - x:=(FeuTCO[i].x-1)*LargeurCell; - y:=(FeuTCO[i].y-1)*HauteurCell; adresse:=FeuTCO[i].adresse; if adresse<>0 then begin - index:=index_feu(adresse); - if index<>0 then + a:=EtatsignalCplx[adresse]; // a = état binaire du feu + if TestBit(a,jaune_cli) or TestBit(a,ral_60) or + TestBit(a,rappel_60) or testBit(a,semaphore_cli) or + testBit(a,vert_cli) or testbit(a,blanc_cli) then begin - aspect:=feux[index].aspect; - case aspect of - 2 : ImageFeu:=Formprinc.Image2feux; - 3 : ImageFeu:=Formprinc.Image3feux; - 4 : ImageFeu:=Formprinc.Image4feux; - 5 : ImageFeu:=Formprinc.Image5feux; - 7 : ImageFeu:=Formprinc.Image7feux; - 9 : ImageFeu:=Formprinc.Image9feux; - else ImageFeu:=Formprinc.Image3feux; - end; - - TailleY:=ImageFeu.picture.BitMap.Height; // taille du feu d'origine (verticale) - TailleX:=ImageFeu.picture.BitMap.Width; - frx:=LargeurCell/TailleX; - frY:=2*HauteurCell/TailleY; - - a:=EtatsignalCplx[adresse]; // a = état binaire du feu - if TestBit(a,jaune_cli) or TestBit(a,ral_60) or - TestBit(a,rappel_60) or testBit(a,semaphore_cli) or - testBit(a,vert_cli) or testbit(a,blanc_cli) then - Dessine_feu_mx(PCanvasTCO,x,y,frx,fry,adresse,1); - end; + aspect:=feuTCO[i].aspect; + case aspect of + 2 : ImageFeu:=Formprinc.Image2feux; + 3 : ImageFeu:=Formprinc.Image3feux; + 4 : ImageFeu:=Formprinc.Image4feux; + 5 : ImageFeu:=Formprinc.Image5feux; + 7 : ImageFeu:=Formprinc.Image7feux; + 9 : ImageFeu:=Formprinc.Image9feux; + else ImageFeu:=Formprinc.Image3feux; + end; + + x:=(FeuTCO[i].x-1)*LargeurCell; // coordonnées XY et feu + y:=(FeuTCO[i].y-1)*HauteurCell; + TailleY:=ImageFeu.picture.BitMap.Height; // taille du feu d'origine (verticale) + TailleX:=ImageFeu.picture.BitMap.Width; + Orientation:=FeuTCO[i].FeuOriente; + // réduction variable en fonction de la taille des cellules + calcul_reduction(frx,fry,round(TailleX*LargeurCell/ZoomMax),round(tailleY*HauteurCell/ZoomMax),TailleX,TailleY); + + // décalage en X pour mettre la tete du feu alignée sur le bord droit de la cellule pour les feux tournés à 90G + if orientation=2 then + begin + if aspect=9 then x:=x+round(10*frX); + if aspect=7 then x:=x+round(10*frX); + if aspect=5 then begin x:=x+round(10*frX);y:=y+HauteurCell-round(tailleX*frY); end; + if aspect=4 then begin x:=x+round(10*frX);y:=y+HauteurCell-round(tailleX*frY); end; + if aspect=3 then begin x:=x+round(10*frX);y:=y+HauteurCell-round(tailleX*frY); end; + if aspect=2 then begin x:=x+round(10*frX);y:=y+HauteurCell-round(tailleX*frY); end; + end; + Dessine_feu_mx(PCanvasTCO,x,y,frx,fry,adresse,orientation); + end; end; end; end; @@ -7014,6 +7218,7 @@ begin if AffTickSimu then Affiche('Simulation '+intToSTR(I_simule)+' Tick='+IntToSTR(tick)+' det='+intToSTR(Tablo_simule[i_simule].detecteur)+'='+IntToSTR(Tablo_simule[i_simule].etat),Cyan); Event_Detecteur(Tablo_simule[i_simule].detecteur, Tablo_simule[i_simule].etat=1); // créer évt détecteur end; + // evt aiguillage ? if Tablo_simule[i_simule].aiguillage<>0 then begin @@ -7252,7 +7457,10 @@ begin if model<>0 then begin s:='Aiguillage '+IntToSTR(i)+' : '+intToSTR(aiguillage[i].position); - if aiguillage[i].position=1 then s:=s+' (dévié)' else s:=s+' (droit)'; + if aiguillage[i].position=const_devie then s:=s+' (dévié)' ; + if aiguillage[i].position=const_droit then s:=s+' (droit)'; + if aiguillage[i].position=9 then s:=s+' inconnue'; + objet:=aiguillage[i].objet; if objet<>0 then s:=s+' objet='+intToSTR(objet); if model=4 then // aig triple @@ -7578,8 +7786,8 @@ begin Affiche('Version 1.43 : Correction erreur gestion sémaphore',clLime); Affiche('Version 1.44 : Gestion trains avec voitures éclairées',clLime); Affiche('Version 1.45 : Rejette les n° d''objets supérieurs aiguillages à la même adresse',clLime); - Affiche('Version 1.5 : Nouvel algorithme de suivi des trains',clLime); - + Affiche('Version 1.5 : Nouvel algorithme de suivi des trains - Gestion des feux provenant de voies en buttoir',clLime); + Affiche('Version 1.6 : Implémentation du TCO. Ouverture de CDM rail au démarrage avec LAY à la demande',clLime); end; procedure TFormPrinc.ClientSocketLenzDisconnect(Sender: TObject; @@ -7667,6 +7875,7 @@ begin end; +// lit un fichier de CV vers un accessoire procedure Lire_fichier_CV; var s: string; fte : textfile; @@ -7687,7 +7896,6 @@ begin while not(eof(fte)) do begin readln(fte,s); - // s:=' 35 63'; val(s,cv,erreur); if (cv<>0) then @@ -7793,15 +8001,6 @@ begin formconfig.close; end; -procedure TFormPrinc.Button2Click(Sender: TObject); -var i : integer; -begin - //traceliste:=true; - //NivDebug:=3; - i:=test_route_valide(519,517,518); - Affiche(IntToSTR(i),clOrange); -end; - procedure TFormPrinc.Codificationdesactionneurs1Click(Sender: TObject); var i,adr,etatAct,v,aO,aF : integer; @@ -7878,11 +8077,30 @@ begin end; + + +procedure TFormPrinc.ButtonAffTCOClick(Sender: TObject); +var hd : THandle; +begin + //SetactiveWindow(formTCO.handle); + //formTCO.BringToFront; + hd:=formTCO.handle; + + // SetForeGroundWindow(hd) ; + ShowWindow(hd,SW_Show); + // sendMessage(hd,wm_syscommand,sc_minimize,0); +end; + + +procedure TFormPrinc.ButtonLanceCDMClick(Sender: TObject); +begin + if Lance_CDM then connecte_CDM; +end; + begin - end. diff --git a/UnitSimule.dcu b/UnitSimule.dcu index 6cf92cec4c84360e890d92589a735f0a808ab153..2a537a7f8f71d106c23584b4c5e83a732e73f43c 100644 GIT binary patch delta 90 zcmeCR>9yg$&%nUXE62bvbHjv*+;dr+OkQl=xJE!!><2Rg!zRWT3_!3DM07KBH~e7U od`Xm@osnVk9T`(W=_=-9yg$&%nUXE62dV6WuhCdoBy>krw8SYXn5aSXdYsHZi_n0D^@eqMM<+frVxB pB~f;E=G8^alW)nG@-ZA`VqjwUa~4ESl$op`E5)R!G}&7A5&-fH7Ht3k diff --git a/UnitTCO.dcu b/UnitTCO.dcu index 01fff9a2feaa36de5665e76f0d87d757657e5b7c..44a5bf9c1175adab5fa76bba0604d045ac59bcb1 100644 GIT binary patch literal 94460 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
;FK6XLmf1;08oFDlw+Fm;%KJl2*_w?0e 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 literal 61249 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 diff --git a/UnitTCO.dfm b/UnitTCO.dfm index 31925d8..6a2cf58 100644 --- a/UnitTCO.dfm +++ b/UnitTCO.dfm @@ -1,7 +1,7 @@ object FormTCO: TFormTCO - Left = 251 - Top = 202 - Width = 928 + Left = 232 + Top = 211 + Width = 992 Height = 681 VertScrollBar.Visible = False Caption = 'FormTCO' @@ -15,47 +15,50 @@ object FormTCO: TFormTCO KeyPreview = True OldCreateOrder = False OnActivate = FormActivate + OnClose = FormClose OnCreate = FormCreate OnDockOver = FormDockOver OnKeyDown = FormKeyDown + DesignSize = ( + 976 + 643) PixelsPerInch = 96 TextHeight = 13 object LabelX: TLabel - Left = 32 - Top = 14 - Width = 53 - Height = 19 - Caption = 'LabelX' + Left = 72 + Top = 6 + Width = 7 + Height = 16 + Caption = '0' Font.Charset = ANSI_CHARSET Font.Color = clWindowText - Font.Height = -16 + Font.Height = -13 Font.Name = 'Arial' Font.Style = [fsBold] ParentFont = False end object Label2: TLabel Left = 16 - Top = 16 - Width = 13 - Height = 13 - Caption = 'X=' - end - object Label3: TLabel - Left = 104 - Top = 16 - Width = 13 - Height = 13 - Caption = 'X=' + Top = 6 + Width = 49 + Height = 16 + Caption = 'Cellule' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -13 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False end object LabelY: TLabel - Left = 120 - Top = 14 - Width = 51 - Height = 19 - Caption = 'Label1' + Left = 96 + Top = 6 + Width = 7 + Height = 16 + Caption = '0' Font.Charset = ANSI_CHARSET Font.Color = clWindowText - Font.Height = -16 + Font.Height = -13 Font.Name = 'Arial' Font.Style = [fsBold] ParentFont = False @@ -63,392 +66,64 @@ object FormTCO: TFormTCO object Label1: TLabel Left = 776 Top = 8 - Width = 32 + Width = 3 Height = 13 - Caption = 'Label1' - end - object Label4: TLabel - Left = 24 - Top = 480 - Width = 175 - Height = 25 - Caption = 'Adresse de l'#39#233'l'#233'ment: ' - Font.Charset = ANSI_CHARSET - Font.Color = clWindowText - Font.Height = -21 - Font.Name = 'Arial Narrow' - Font.Style = [] - ParentFont = False - end - object Label5: TLabel - Left = 24 - Top = 520 - Width = 150 - Height = 25 - Caption = 'Type de l'#39#233'l'#233'ment: ' - Font.Charset = ANSI_CHARSET - Font.Color = clWindowText - Font.Height = -21 - Font.Name = 'Arial Narrow' - Font.Style = [] - ParentFont = False - end - object ImagePalette1: TImage - Left = 440 - Top = 480 - Width = 41 - Height = 41 - DragMode = dmAutomatic - OnEndDrag = ImagePalette1EndDrag - OnMouseDown = ImagePalette1MouseDown - end - object ImagePalette2: TImage - Left = 512 - Top = 480 - Width = 41 - Height = 41 - DragMode = dmAutomatic - OnEndDrag = ImagePalette2EndDrag - OnMouseDown = ImagePalette2MouseDown - end - object ImagePalette3: TImage - Left = 584 - Top = 480 - Width = 41 - Height = 41 - DragMode = dmAutomatic - OnEndDrag = ImagePalette3EndDrag - OnMouseDown = ImagePalette3MouseDown - end - object ImagePalette4: TImage - Left = 656 - Top = 480 - Width = 41 - Height = 41 - DragMode = dmAutomatic - OnEndDrag = ImagePalette4EndDrag - OnMouseDown = ImagePalette4MouseDown - end - object ImagePaletteDroit: TImage - Left = 440 - Top = 528 - Width = 41 - Height = 41 - DragMode = dmAutomatic - OnEndDrag = ImagePaletteDroitEndDrag - OnMouseDown = ImagePaletteDroitMouseDown - end - object ImageSupG: TImage - Left = 512 - Top = 528 - Width = 41 - Height = 41 - DragMode = dmAutomatic - OnEndDrag = ImageSupGEndDrag - OnMouseDown = ImageSupGMouseDown - end - object ImageSupD: TImage - Left = 584 - Top = 528 - Width = 41 - Height = 41 - DragMode = dmAutomatic - OnEndDrag = ImageSupDEndDrag - OnMouseDown = ImageSupDMouseDown - end - object ImageInfD: TImage - Left = 656 - Top = 528 - Width = 41 - Height = 41 - DragMode = dmAutomatic - OnEndDrag = ImageInfDEndDrag - OnMouseDown = ImageInfDMouseDown - end - object ImageInfG: TImage - Left = 728 - Top = 528 - Width = 41 - Height = 41 - DragMode = dmAutomatic - OnEndDrag = ImageInfGEndDrag - OnMouseDown = ImageInfGMouseDown - end - object Label6: TLabel - Left = 424 - Top = 488 - Width = 9 - Height = 19 - Caption = '1' - Font.Charset = ANSI_CHARSET - Font.Color = clWindowText - Font.Height = -16 - Font.Name = 'Arial' - Font.Style = [fsBold] - ParentFont = False - end - object Label7: TLabel - Left = 496 - Top = 488 - Width = 9 - Height = 19 - Caption = '2' - Font.Charset = ANSI_CHARSET - Font.Color = clWindowText - Font.Height = -16 - Font.Name = 'Arial' - Font.Style = [fsBold] - ParentFont = False - end - object Label8: TLabel - Left = 568 - Top = 488 - Width = 9 - Height = 19 - Caption = '3' - Font.Charset = ANSI_CHARSET - Font.Color = clWindowText - Font.Height = -16 - Font.Name = 'Arial' - Font.Style = [fsBold] - ParentFont = False - end - object Label9: TLabel - Left = 640 - Top = 488 - Width = 9 - Height = 19 - Caption = '4' - Font.Charset = ANSI_CHARSET - Font.Color = clWindowText - Font.Height = -16 - Font.Name = 'Arial' - Font.Style = [fsBold] - ParentFont = False - end - object Label10: TLabel - Left = 424 - Top = 536 - Width = 9 - Height = 19 - Caption = '5' - Font.Charset = ANSI_CHARSET - Font.Color = clWindowText - Font.Height = -16 - Font.Name = 'Arial' - Font.Style = [fsBold] - ParentFont = False - end - object Label11: TLabel - Left = 496 - Top = 536 - Width = 9 - Height = 19 - Caption = '6' - Font.Charset = ANSI_CHARSET - Font.Color = clWindowText - Font.Height = -16 - Font.Name = 'Arial' - Font.Style = [fsBold] - ParentFont = False - end - object Label12: TLabel - Left = 568 - Top = 536 - Width = 9 - Height = 19 - Caption = '7' - Font.Charset = ANSI_CHARSET - Font.Color = clWindowText - Font.Height = -16 - Font.Name = 'Arial' - Font.Style = [fsBold] - ParentFont = False - end - object Label13: TLabel - Left = 640 - Top = 536 - Width = 9 - Height = 19 - Caption = '8' - Font.Charset = ANSI_CHARSET - Font.Color = clWindowText - Font.Height = -16 - Font.Name = 'Arial' - Font.Style = [fsBold] - ParentFont = False - end - object Label14: TLabel - Left = 712 - Top = 536 - Width = 9 - Height = 19 - Caption = '9' - Font.Charset = ANSI_CHARSET - Font.Color = clWindowText - Font.Height = -16 - Font.Name = 'Arial' - Font.Style = [fsBold] - ParentFont = False - end - object Label15: TLabel - Left = 24 - Top = 560 - Width = 158 - Height = 25 - Caption = 'Image de l'#39#233'l'#233'ment: ' - Font.Charset = ANSI_CHARSET - Font.Color = clWindowText - Font.Height = -21 - Font.Name = 'Arial Narrow' - Font.Style = [] - ParentFont = False - end - object ImageDiag1: TImage - Left = 440 - Top = 576 - Width = 41 - Height = 41 - DragMode = dmAutomatic - OnEndDrag = ImageDiag1EndDrag - OnMouseDown = ImageDiag1MouseDown - end - object Label16: TLabel - Left = 416 - Top = 584 - Width = 18 - Height = 19 - Caption = '10' - Font.Charset = ANSI_CHARSET - Font.Color = clWindowText - Font.Height = -16 - Font.Name = 'Arial' - Font.Style = [fsBold] - ParentFont = False - end - object ImageDiag2: TImage - Left = 512 - Top = 576 - Width = 41 - Height = 41 - DragMode = dmAutomatic - OnEndDrag = ImageDiag2EndDrag - OnMouseDown = ImageDiag2MouseDown - end - object Label17: TLabel - Left = 488 - Top = 584 - Width = 17 - Height = 19 - Caption = '11' - Font.Charset = ANSI_CHARSET - Font.Color = clWindowText - Font.Height = -16 - Font.Name = 'Arial' - Font.Style = [fsBold] - ParentFont = False - end - object ImageFeu: TImage - Left = 584 - Top = 576 - Width = 25 - Height = 41 - DragMode = dmAutomatic - Stretch = True - OnEndDrag = ImageFeuEndDrag - OnMouseDown = ImageFeuMouseDown - end - object Label18: TLabel - Left = 560 - Top = 584 - Width = 18 - Height = 19 - Caption = '12' - Font.Charset = ANSI_CHARSET - Font.Color = clWindowText - Font.Height = -16 - Font.Name = 'Arial' - Font.Style = [fsBold] - ParentFont = False - end - object ImageTemp: TImage - Left = 304 - Top = 504 - Width = 97 - Height = 97 + Caption = '-' end object SourisX: TLabel Left = 232 Top = 8 - Width = 36 + Width = 6 Height = 13 - Caption = 'SourisX' + Caption = '0' end object SourisY: TLabel Left = 288 Top = 8 - Width = 36 + Width = 6 Height = 13 - Caption = 'SourisY' + Caption = '0' end - object EditAdrElement: TEdit - Left = 200 - Top = 480 - Width = 89 - Height = 33 - Font.Charset = ANSI_CHARSET + object ImageTemp: TImage + Left = 16 + Top = 464 + Width = 97 + Height = 97 + end + object Label19: TLabel + Left = 912 + Top = 456 + Width = 32 + Height = 13 + Anchors = [akRight, akBottom] + Caption = 'Zoom' + Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText - Font.Height = -21 - Font.Name = 'Arial Narrow' - Font.Style = [] + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] ParentFont = False - TabOrder = 1 - OnChange = EditAdrElementChange - end - object EditTypeElement: TEdit - Left = 200 - Top = 520 - Width = 89 - Height = 33 - Font.Charset = ANSI_CHARSET - Font.Color = clWindowText - Font.Height = -21 - Font.Name = 'Arial Narrow' - Font.Style = [] - ParentFont = False - ReadOnly = True - TabOrder = 0 - end - object ButtonSauveTCO: TButton - Left = 784 - Top = 480 - Width = 91 - Height = 33 - Caption = 'Sauvegarder TCO' - TabOrder = 2 - WordWrap = True - OnClick = ButtonSauveTCOClick - end - object ButtonRedessine: TButton - Left = 784 - Top = 520 - Width = 89 - Height = 33 - Caption = 'Redessine' - TabOrder = 3 - OnClick = ButtonRedessineClick end object ScrollBox: TScrollBox - Left = 16 - Top = 40 - Width = 873 - Height = 425 - TabOrder = 4 + Left = 8 + Top = 32 + Width = 889 + Height = 433 + HorzScrollBar.Smooth = True + HorzScrollBar.Tracking = True + VertScrollBar.Smooth = True + VertScrollBar.Tracking = True + Anchors = [akLeft, akTop, akRight, akBottom] + TabOrder = 0 + DesignSize = ( + 885 + 429) object ImageTCO: TImage Left = 0 Top = 0 Width = 865 - Height = 409 + Height = 361 + Anchors = [akLeft, akTop, akRight, akBottom] PopupMenu = PopupMenu1 OnClick = ImageTCOClick OnContextPopup = ImageTCOContextPopup @@ -458,50 +133,544 @@ object FormTCO: TFormTCO OnMouseUp = ImageTCOMouseUp end end - object EditTypeImage: TEdit - Left = 200 - Top = 560 - Width = 89 - Height = 33 + object TrackBarZoom: TTrackBar + Left = 912 + Top = 40 + Width = 41 + Height = 409 + Anchors = [akTop, akRight, akBottom] + Max = 50 + Min = 20 + Orientation = trVertical + Position = 20 + TabOrder = 1 + TickMarks = tmTopLeft + OnChange = TrackBarZoomChange + end + object Panel1: TPanel + Left = 8 + Top = 472 + Width = 953 + Height = 153 + Anchors = [akLeft, akRight, akBottom] Font.Charset = ANSI_CHARSET - Font.Color = clWindowText - Font.Height = -21 - Font.Name = 'Arial Narrow' + Font.Color = clBlue + Font.Height = -9 + Font.Name = 'MS Sans Serif' Font.Style = [] ParentFont = False - TabOrder = 5 - OnKeyPress = EditTypeImageKeyPress - end - object Button1: TButton - Left = 784 - Top = 560 - Width = 89 - Height = 25 - Caption = 'Simu det 1' - TabOrder = 6 - OnClick = Button1Click - end - object Button2: TButton - Left = 784 - Top = 592 - Width = 89 - Height = 25 - Caption = 'Simu Det 0' - TabOrder = 7 - OnClick = Button2Click - end - object ButtonConfigTCO: TButton - Left = 576 - Top = 8 - Width = 113 - Height = 25 - Caption = 'Configuration TCO' - TabOrder = 8 - OnClick = ButtonConfigTCOClick + TabOrder = 2 + object Label4: TLabel + Left = 8 + Top = 8 + Width = 137 + Height = 20 + Caption = 'Adresse de l'#39#233'l'#233'ment: ' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -16 + Font.Name = 'Arial Narrow' + Font.Style = [] + ParentFont = False + end + object Label5: TLabel + Left = 8 + Top = 32 + Width = 116 + Height = 20 + Caption = 'Type de l'#39#233'l'#233'ment: ' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -16 + Font.Name = 'Arial Narrow' + Font.Style = [] + ParentFont = False + end + object Label15: TLabel + Left = 8 + Top = 56 + Width = 123 + Height = 20 + Caption = 'Image de l'#39#233'l'#233'ment: ' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -16 + Font.Name = 'Arial Narrow' + Font.Style = [] + ParentFont = False + end + object ImagePalette5: TImage + Left = 504 + Top = 8 + Width = 41 + Height = 41 + DragMode = dmAutomatic + OnEndDrag = ImagePalette5EndDrag + OnMouseDown = ImagePalette5MouseDown + end + object Label6: TLabel + Left = 200 + Top = 22 + Width = 9 + Height = 19 + Caption = '1' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -16 + Font.Name = 'Arial' + Font.Style = [fsBold] + ParentFont = False + end + object ImagePalette2: TImage + Left = 288 + Top = 8 + Width = 41 + Height = 41 + DragMode = dmAutomatic + OnEndDrag = ImagePalette2EndDrag + OnMouseDown = ImagePalette2MouseDown + end + object Label7: TLabel + Left = 272 + Top = 22 + Width = 9 + Height = 19 + Caption = '2' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -16 + Font.Name = 'Arial' + Font.Style = [fsBold] + ParentFont = False + end + object Label10: TLabel + Left = 488 + Top = 22 + Width = 9 + Height = 19 + Caption = '5' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -16 + Font.Name = 'Arial' + Font.Style = [fsBold] + ParentFont = False + end + object ImagePaletteDroit: TImage + Left = 216 + Top = 8 + Width = 41 + Height = 41 + DragMode = dmAutomatic + OnEndDrag = ImagePaletteDroitEndDrag + OnMouseDown = ImagePaletteDroitMouseDown + end + object ImageSupG: TImage + Left = 216 + Top = 56 + Width = 41 + Height = 41 + DragMode = dmAutomatic + OnEndDrag = ImageSupGEndDrag + OnMouseDown = ImageSupGMouseDown + end + object ImageSupD: TImage + Left = 288 + Top = 56 + Width = 41 + Height = 41 + DragMode = dmAutomatic + OnEndDrag = ImageSupDEndDrag + OnMouseDown = ImageSupDMouseDown + end + object ImageInfD: TImage + Left = 360 + Top = 56 + Width = 41 + Height = 41 + DragMode = dmAutomatic + OnEndDrag = ImageInfDEndDrag + OnMouseDown = ImageInfDMouseDown + end + object ImageInfG: TImage + Left = 432 + Top = 56 + Width = 41 + Height = 41 + DragMode = dmAutomatic + OnEndDrag = ImageInfGEndDrag + OnMouseDown = ImageInfGMouseDown + end + object Label11: TLabel + Left = 200 + Top = 70 + Width = 9 + Height = 19 + Caption = '6' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -16 + Font.Name = 'Arial' + Font.Style = [fsBold] + ParentFont = False + end + object Label12: TLabel + Left = 272 + Top = 70 + Width = 9 + Height = 19 + Caption = '7' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -16 + Font.Name = 'Arial' + Font.Style = [fsBold] + ParentFont = False + end + object Label13: TLabel + Left = 344 + Top = 70 + Width = 9 + Height = 19 + Caption = '8' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -16 + Font.Name = 'Arial' + Font.Style = [fsBold] + ParentFont = False + end + object Label14: TLabel + Left = 416 + Top = 70 + Width = 9 + Height = 19 + Caption = '9' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -16 + Font.Name = 'Arial' + Font.Style = [fsBold] + ParentFont = False + end + object ImagePalette3: TImage + Left = 360 + Top = 8 + Width = 41 + Height = 41 + DragMode = dmAutomatic + OnEndDrag = ImagePalette3EndDrag + OnMouseDown = ImagePalette3MouseDown + end + object ImagePalette4: TImage + Left = 432 + Top = 8 + Width = 41 + Height = 41 + DragMode = dmAutomatic + OnEndDrag = ImagePalette4EndDrag + OnMouseDown = ImagePalette4MouseDown + end + object Label8: TLabel + Left = 344 + Top = 22 + Width = 9 + Height = 19 + Caption = '3' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -16 + Font.Name = 'Arial' + Font.Style = [fsBold] + ParentFont = False + end + object Label9: TLabel + Left = 416 + Top = 22 + Width = 9 + Height = 19 + Caption = '4' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -16 + Font.Name = 'Arial' + Font.Style = [fsBold] + ParentFont = False + end + object ImageDiag1: TImage + Left = 216 + Top = 104 + Width = 41 + Height = 41 + DragMode = dmAutomatic + OnEndDrag = ImageDiag1EndDrag + OnMouseDown = ImageDiag1MouseDown + end + object Label16: TLabel + Left = 192 + Top = 118 + Width = 18 + Height = 19 + Caption = '10' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -16 + Font.Name = 'Arial' + Font.Style = [fsBold] + ParentFont = False + end + object ImageDiag2: TImage + Left = 288 + Top = 104 + Width = 41 + Height = 41 + DragMode = dmAutomatic + OnEndDrag = ImageDiag2EndDrag + OnMouseDown = ImageDiag2MouseDown + end + object Label17: TLabel + Left = 264 + Top = 118 + Width = 17 + Height = 19 + Caption = '11' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -16 + Font.Name = 'Arial' + Font.Style = [fsBold] + ParentFont = False + end + object ImageFeu: TImage + Left = 368 + Top = 104 + Width = 25 + Height = 41 + DragMode = dmAutomatic + Stretch = True + OnEndDrag = ImageFeuEndDrag + OnMouseDown = ImageFeuMouseDown + end + object Label18: TLabel + Left = 336 + Top = 118 + Width = 18 + Height = 19 + Caption = '30' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -16 + Font.Name = 'Arial' + Font.Style = [fsBold] + ParentFont = False + end + object ImageAig45PG_AG: TImage + Left = 576 + Top = 8 + Width = 41 + Height = 41 + DragMode = dmAutomatic + OnEndDrag = ImageAig45PG_AGEndDrag + OnMouseDown = ImageAig45PG_AGMouseDown + end + object Label20: TLabel + Left = 552 + Top = 22 + Width = 18 + Height = 19 + Caption = '12' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -16 + Font.Name = 'Arial' + Font.Style = [fsBold] + ParentFont = False + end + object Label3: TLabel + Left = 624 + Top = 22 + Width = 18 + Height = 19 + Caption = '13' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -16 + Font.Name = 'Arial' + Font.Style = [fsBold] + ParentFont = False + end + object ImageAig45PD_AD: TImage + Left = 648 + Top = 8 + Width = 41 + Height = 41 + DragMode = dmAutomatic + OnEndDrag = ImageAig45PD_ADEndDrag + OnMouseDown = ImageAig45PD_ADMouseDown + end + object Label21: TLabel + Left = 696 + Top = 22 + Width = 18 + Height = 19 + Caption = '14' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -16 + Font.Name = 'Arial' + Font.Style = [fsBold] + ParentFont = False + end + object ImageAig45PD_AG: TImage + Left = 720 + Top = 8 + Width = 41 + Height = 41 + DragMode = dmAutomatic + OnEndDrag = ImageAig45PD_AGEndDrag + OnMouseDown = ImageAig45PD_AGMouseDown + end + object Label22: TLabel + Left = 768 + Top = 22 + Width = 18 + Height = 19 + Caption = '15' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -16 + Font.Name = 'Arial' + Font.Style = [fsBold] + ParentFont = False + end + object ImageAig45PG_AD: TImage + Left = 792 + Top = 8 + Width = 41 + Height = 41 + DragMode = dmAutomatic + OnEndDrag = ImageAig45PG_ADEndDrag + OnMouseDown = ImageAig45PG_ADMouseDown + end + object Label23: TLabel + Left = 8 + Top = 85 + Width = 33 + Height = 20 + Caption = 'Texte' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -16 + Font.Name = 'Arial Narrow' + Font.Style = [] + ParentFont = False + end + object EditAdrElement: TEdit + Left = 152 + Top = 8 + Width = 33 + Height = 28 + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -16 + Font.Name = 'Arial Narrow' + Font.Style = [] + ParentFont = False + TabOrder = 0 + OnChange = EditAdrElementChange + end + object EditTypeElement: TEdit + Left = 152 + Top = 32 + Width = 33 + Height = 33 + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -16 + Font.Name = 'Arial Narrow' + Font.Style = [] + ParentFont = False + ReadOnly = True + TabOrder = 1 + end + object EditTypeImage: TEdit + Left = 152 + Top = 56 + Width = 33 + Height = 28 + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -16 + Font.Name = 'Arial Narrow' + Font.Style = [] + ParentFont = False + TabOrder = 2 + OnKeyPress = EditTypeImageKeyPress + end + object ButtonSauveTCO: TButton + Left = 854 + Top = 48 + Width = 91 + Height = 33 + Caption = 'Sauvegarder TCO' + TabOrder = 3 + WordWrap = True + OnClick = ButtonSauveTCOClick + end + object ButtonRedessine: TButton + Left = 856 + Top = 8 + Width = 89 + Height = 33 + Caption = 'Redessine' + TabOrder = 4 + OnClick = ButtonRedessineClick + end + object Button1: TButton + Left = 672 + Top = 88 + Width = 89 + Height = 25 + Caption = 'Simu det 1' + TabOrder = 5 + OnClick = Button1Click + end + object Button2: TButton + Left = 672 + Top = 120 + Width = 89 + Height = 25 + Caption = 'Simu Det 0' + TabOrder = 6 + OnClick = Button2Click + end + object ButtonConfigTCO: TButton + Left = 832 + Top = 88 + Width = 113 + Height = 33 + Caption = 'Configuration TCO' + TabOrder = 7 + OnClick = ButtonConfigTCOClick + end + object EditTexte: TEdit + Left = 96 + Top = 88 + Width = 89 + Height = 21 + TabOrder = 8 + OnChange = EditTexteChange + end end object PopupMenu1: TPopupMenu - Left = 352 - Top = 472 + Left = 360 + object Annulercouper: TMenuItem + Caption = 'Annuler couper' + OnClick = AnnulercouperClick + end + object N5: TMenuItem + Caption = '-' + end object MenuCouper: TMenuItem Caption = 'Couper' OnClick = MenuCouperClick @@ -517,61 +686,17 @@ object FormTCO: TFormTCO object N1: TMenuItem Caption = '-' end - object Insrer1: TMenuItem - Caption = 'Ins'#233'rer' - object aiguillageG_PG: TMenuItem - Caption = 'Aiguillage gauche ; pointe '#224' gauche' - OnClick = aiguillageG_PGClick - end - object aiguillageD_PD: TMenuItem - Caption = 'Aiguillage droit ; pointe '#224' droite' - OnClick = aiguillageD_PDClick - end - object N2: TMenuItem - Caption = '-' - end - object Aiguillagegauchepointedroite1: TMenuItem - Caption = 'Aiguillage gauche ; pointe '#224' droite' - OnClick = Aiguillagegauchepointedroite1Click - end - object Aiguillagedroitpointegauche1: TMenuItem - Caption = 'Aiguillage droit : pointe '#224' gauche' - OnClick = Aiguillagedroitpointegauche1Click - end - object N3: TMenuItem - Caption = '-' - end - object Elmentdroit1: TMenuItem - Caption = 'El'#233'ment droit' - OnClick = Elmentdroit1Click - end - object N4: TMenuItem - Caption = '-' - end - object Courbegaucheversdroite1: TMenuItem - Caption = 'Courbe infD' - OnClick = Courbegaucheversdroite1Click - end - object Courbedroiteversgauche1: TMenuItem - Caption = 'Courbe infG' - OnClick = Courbedroiteversgauche1Click - end - object CourbeSupD1: TMenuItem - Caption = 'Courbe SupD' - OnClick = CourbeSupD1Click - end - object CourbeSupG1: TMenuItem - Caption = 'Courbe SupG' - OnClick = CourbeSupG1Click - end - end object Tourner90G: TMenuItem - Caption = 'Tourner 90'#176' '#224' gauche' + Caption = 'Positionner 90'#176' '#224' gauche' OnClick = Tourner90GClick end object Tourner90D: TMenuItem - Caption = 'Tourner 90'#176' '#224' droite' + Caption = 'Positionner 90'#176' '#224' droite' OnClick = Tourner90DClick end + object Pos_vert: TMenuItem + Caption = 'Positionner verticalement' + OnClick = Pos_vertClick + end end end diff --git a/UnitTCO.pas b/UnitTCO.pas index 31daf62..e40b909 100644 --- a/UnitTCO.pas +++ b/UnitTCO.pas @@ -4,98 +4,103 @@ interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, - Dialogs, Grids , UnitPrinc, StdCtrls, ExtCtrls, Menus, UnitPilote ; + Dialogs, Grids , UnitPrinc, StdCtrls, ExtCtrls, Menus, UnitPilote, + ComCtrls ; type TFormTCO = class(TForm) LabelX: TLabel; Label2: TLabel; - Label3: TLabel; LabelY: TLabel; PopupMenu1: TPopupMenu; MenuCouper: TMenuItem; N1: TMenuItem; - Insrer1: TMenuItem; - aiguillageG_PG: TMenuItem; Label1: TLabel; - aiguillageD_PD: TMenuItem; - N2: TMenuItem; - Aiguillagegauchepointedroite1: TMenuItem; - Aiguillagedroitpointegauche1: TMenuItem; - N3: TMenuItem; - Elmentdroit1: TMenuItem; - N4: TMenuItem; - Courbegaucheversdroite1: TMenuItem; - Courbedroiteversgauche1: TMenuItem; - CourbeSupD1: TMenuItem; - CourbeSupG1: TMenuItem; + MenuCopier: TMenuItem; + MenuColler: TMenuItem; + ScrollBox: TScrollBox; + ImageTCO: TImage; + Tourner90G: TMenuItem; + Tourner90D: TMenuItem; + SourisX: TLabel; + SourisY: TLabel; + Pos_vert: TMenuItem; + TrackBarZoom: TTrackBar; + Panel1: TPanel; Label4: TLabel; - EditAdrElement: TEdit; Label5: TLabel; + Label15: TLabel; + EditAdrElement: TEdit; EditTypeElement: TEdit; - ImagePalette1: TImage; + EditTypeImage: TEdit; + ImageTemp: TImage; + ImagePalette5: TImage; + Label6: TLabel; ImagePalette2: TImage; - ImagePalette3: TImage; - ImagePalette4: TImage; + Label7: TLabel; + Label10: TLabel; ImagePaletteDroit: TImage; ImageSupG: TImage; ImageSupD: TImage; ImageInfD: TImage; ImageInfG: TImage; - ButtonSauveTCO: TButton; - Label6: TLabel; - Label7: TLabel; - Label8: TLabel; - Label9: TLabel; - Label10: TLabel; Label11: TLabel; Label12: TLabel; Label13: TLabel; Label14: TLabel; - MenuCopier: TMenuItem; - MenuColler: TMenuItem; - ButtonRedessine: TButton; - ScrollBox: TScrollBox; - ImageTCO: TImage; - Label15: TLabel; - EditTypeImage: TEdit; - Button1: TButton; - Button2: TButton; + ImagePalette3: TImage; + ImagePalette4: TImage; + Label8: TLabel; + Label9: TLabel; ImageDiag1: TImage; Label16: TLabel; ImageDiag2: TImage; Label17: TLabel; - ButtonConfigTCO: TButton; ImageFeu: TImage; Label18: TLabel; - ImageTemp: TImage; - Tourner90G: TMenuItem; - Tourner90D: TMenuItem; - SourisX: TLabel; - SourisY: TLabel; + ButtonSauveTCO: TButton; + ButtonRedessine: TButton; + Button1: TButton; + Button2: TButton; + Label19: TLabel; + ButtonConfigTCO: TButton; + Annulercouper: TMenuItem; + N5: TMenuItem; + ImageAig45PG_AG: TImage; + Label20: TLabel; + Label3: TLabel; + ImageAig45PD_AD: TImage; + Label21: TLabel; + ImageAig45PD_AG: TImage; + Label22: TLabel; + ImageAig45PG_AD: TImage; + Label23: TLabel; + EditTexte: TEdit; procedure FormCreate(Sender: TObject); procedure ImageTCOClick(Sender: TObject); procedure FormActivate(Sender: TObject); procedure ImageTCOContextPopup(Sender: TObject; MousePos: TPoint; var Handled: Boolean); - procedure aiguillageG_PGClick(Sender: TObject); - procedure dessin_AigPG_AG(Canvas : Tcanvas;x,y : integer;couleur : Tcolor;Mode : TPenMode); - procedure dessin_AigPD_AD(Canvas : Tcanvas;x,y : integer;couleur : Tcolor;Mode : TPenMode); + procedure dessin_AigPG_AG(Canvas : Tcanvas;x,y : integer;couleur : Tcolor;Mode : TPenMode;position : integer); + procedure dessin_Aig45PG_AG(Canvas : Tcanvas;x,y : integer;couleur : Tcolor;Mode : TPenMode; position : integer); + procedure dessin_Aig45PD_AG(Canvas : Tcanvas;x,y : integer;couleur : Tcolor;Mode : TPenMode; position : integer); + procedure dessin_Aig45PD_AD(Canvas : Tcanvas;x,y : integer;couleur : Tcolor;Mode : TPenMode;position : integer); + procedure dessin_Aig45PG_AD(Canvas : Tcanvas;x,y : integer;couleur : Tcolor;Mode : TPenMode;position : integer); + procedure dessin_AigPD_AD(Canvas : Tcanvas;x,y : integer;couleur : Tcolor;Mode : TPenMode;position : integer); procedure dessin_Diag1(Canvas : Tcanvas;x,y : integer;couleur : Tcolor;Mode : TPenMode); procedure dessin_Diag2(Canvas : Tcanvas;x,y : integer;couleur : Tcolor;Mode : TPenMode); procedure dessin_infG(Canvas : Tcanvas;x,y : integer;couleur : Tcolor;Mode : TPenMode); procedure dessin_infD(Canvas : Tcanvas;x,y : integer;couleur : Tcolor;Mode : TPenMode); procedure Entoure_cell(x,y : integer); procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); - procedure aiguillageD_PDClick(Sender: TObject); - procedure Aiguillagegauchepointedroite1Click(Sender: TObject); - procedure dessin_AigG_PD(canvas : Tcanvas;X,Y : integer; couleur : Tcolor;Mode : TPenMode); +// procedure Aiguillagegauchepointedroite1Click(Sender: TObject); + procedure dessin_AigG_PD(canvas : Tcanvas;X,Y : integer; couleur : Tcolor;Mode : TPenMode;position : integer); procedure Elmentdroit1Click(Sender: TObject); procedure dessin_voie(Canvas : Tcanvas;x,y : integer;couleur : TColor;Mode : TPenMode); procedure Courbegaucheversdroite1Click(Sender: TObject); procedure Courbedroiteversgauche1Click(Sender: TObject); - procedure Aiguillagedroitpointegauche1Click(Sender: TObject); - procedure dessin_AigD_PG(Canvas : Tcanvas;x,y : integer; couleur : Tcolor;Mode : TPenMode); +// procedure Aiguillagedroitpointegauche1Click(Sender: TObject); + procedure dessin_AigD_PG(Canvas : Tcanvas;x,y : integer; couleur : Tcolor;Mode : TPenMode;position : integer ); procedure CourbeSupD1Click(Sender: TObject); procedure dessin_SupD(Canvas : Tcanvas;x,y : integer; couleur : Tcolor;Mode : TPenMode); procedure CourbeSupG1Click(Sender: TObject); @@ -103,9 +108,9 @@ type procedure ImageTCODragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean); procedure FormDockOver(Sender: TObject; Source: TDragDockObject; X,Y: Integer; State: TDragState; var Accept: Boolean); - procedure ImagePalette1MouseDown(Sender: TObject; Button: TMouseButton; + procedure ImagePalette5MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); - procedure ImagePalette1EndDrag(Sender, Target: TObject; X, Y: Integer); + procedure ImagePalette5EndDrag(Sender, Target: TObject; X, Y: Integer); procedure ImagePalette2EndDrag(Sender, Target: TObject; X, Y: Integer); procedure ImagePalette2MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); @@ -150,7 +155,7 @@ type procedure EditTypeImageKeyPress(Sender: TObject; var Key: Char); procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); - procedure Maj_TCO(Adresse : integer;etat : boolean); + procedure Maj_TCO(Adresse : integer); procedure ImageDiag1EndDrag(Sender, Target: TObject; X, Y: Integer); procedure ImageDiag1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); @@ -163,6 +168,27 @@ type Shift: TShiftState; X, Y: Integer); procedure Tourner90GClick(Sender: TObject); procedure Tourner90DClick(Sender: TObject); + procedure Pos_vertClick(Sender: TObject); + procedure TrackBarZoomChange(Sender: TObject); + procedure AnnulercouperClick(Sender: TObject); + procedure FormClose(Sender: TObject; var Action: TCloseAction); + procedure ImageAig45PG_AGEndDrag(Sender, Target: TObject; X, + Y: Integer); + procedure ImageAig45PG_AGMouseDown(Sender: TObject; + Button: TMouseButton; Shift: TShiftState; X, Y: Integer); + procedure ImageAig45PD_ADEndDrag(Sender, Target: TObject; X, + Y: Integer); + procedure ImageAig45PD_ADMouseDown(Sender: TObject; + Button: TMouseButton; Shift: TShiftState; X, Y: Integer); + procedure ImageAig45PD_AGEndDrag(Sender, Target: TObject; X, + Y: Integer); + procedure ImageAig45PD_AGMouseDown(Sender: TObject; + Button: TMouseButton; Shift: TShiftState; X, Y: Integer); + procedure ImageAig45PG_ADEndDrag(Sender, Target: TObject; X, + Y: Integer); + procedure ImageAig45PG_ADMouseDown(Sender: TObject; + Button: TMouseButton; Shift: TShiftState; X, Y: Integer); + procedure EditTexteChange(Sender: TObject); private { Déclarations privées } @@ -170,28 +196,41 @@ type { Déclarations publiques } end; - TTCO = array[1..100] of array[1..50] of record + + +const + clGrille=$404040; + ZoomMax=50; + MaxCellX=100;MaxCellY=50; + +type + + TTCO = array[1..MaxCellX] of array[1..MaxCellY] of record BType : integer ; // 1= détecteur 2= aiguillage 3=bis 4=Buttoir Adresse : integer ; // adresse du détecteur ou de l'aiguillage ou du feu - BImage : integer ; // 0=rien 1=voie 2=aiguillage gauche gauche ... 12=feu - FeuAspect : integer; // aspect du feu (2 feux...9 feux) - FeuOriente : integer ; // orientation du feu : 1 vertical en bas / 2 horizontal gauche / 3 horizontal droit + IndexFeu : integer ; // index du feu dans le tableau FeuTCO + BImage : integer ; // 0=rien 1=voie 2=aiguillage gauche gauche ... 30=feu + Texte : string[30]; + //FeuAspect : integer; // aspect du feu (2 feux...9 feux) + //FeuOriente : integer ; // orientation du feu : 1 vertical en bas / 2 horizontal gauche / 3 horizontal droit + PiedFeu : integer; // type de pied au feu end; TfeuTCO = array[1..50] of record Adresse : integer ; // adresse du feu; x,y : integer ; // coordonnées pixels FeuOriente : integer; + PiedFeu : integer; + Aspect : integer; end; -const - clGrille=$707070; + var Fond,couleurAdresse : Tcolor; FormTCO: TFormTCO; - Forminit,sourisclic,SelectionAffichee,TamponAffecte : boolean; - HtImageTCO,LargImageTCO,XclicCell,YclicCell,XminiSel,YminiSel, + Forminit,sourisclic,SelectionAffichee,TamponAffecte,entoure,Diffusion,TCO_modifie : boolean; + HtImageTCO,LargImageTCO,XclicCell,YclicCell,XminiSel,YminiSel,XCoupe,Ycoupe, XmaxiSel,YmaxiSel,AncienXMiniSel,AncienXMaxiSel ,AncienYMiniSel,AncienYMaxiSel, - Xclic,Yclic,XClicCellInserer,YClicCellInserer : integer; + Xclic,Yclic,XClicCellInserer,YClicCellInserer,Xentoure,Yentoure : integer; TamponTCO,tco : TTco ; TamponTCO_Org : record @@ -205,9 +244,12 @@ var PScrollBoxTCO : TScrollBox; PImageTCO : Timage; PImageTemp : TImage; - + frXGlob,frYGlob : real; LargeurCell,HauteurCell,NbreCellX,NbreCellY : integer ; +procedure calcul_reduction(Var frx,fry : real;DimDestX,DimDestY,DimOrgX,DimOrgY : integer); +procedure sauve_fichier_tco; + implementation uses UnitConfigTCO; @@ -219,14 +261,13 @@ uses UnitConfigTCO; procedure lire_fichier_tco; var fichier : textfile; s : string; - x,y,i,valeur,erreur : integer; + x,y,i,adresse,Aspect,valeur,erreur,FeuOriente,PiedFeu : integer; function lit_ligne : string ; var c : char; begin repeat readln(fichier,s); - s:=uppercase(s); //Affiche(s,clWhite); if length(s)>0 then c:=s[1]; until ((c<>'/') and (s<>'')) or eof(fichier) ; @@ -242,25 +283,19 @@ begin end; x:=1;y:=1;NbreCellX:=0;NbreCellY:=0;NbFeuTCO:=0; + // taille de la matrice + s:=lit_ligne; + Val(s,NbreCellX,erreur); + delete(s,1,erreur); + Val(s,NbreCellY,erreur); + + // largeur et hauteur des cellules + s:=lit_ligne; + Val(s,LargeurCell,erreur); + delete(s,1,erreur); + Val(s,HauteurCell,erreur); - //Faire une passe pour lire la taille de la matrice - while not eof(fichier) do - begin - s:=lit_ligne; - if s[1]<>'/' then - begin - inc(NbreCellY); NbreCellX:=0; - repeat - i:=pos(')',s); - if i=0 then begin closefile(fichier);exit;end; - delete(s,1,i); - inc(NbreCellX); - until s=''; - end; - end; - reset(fichier); - - // 2eme passe : lire le fichier + // lire le fichier while not eof(fichier) do begin s:=lit_ligne; @@ -271,41 +306,68 @@ begin if i=0 then begin closefile(fichier);exit;end; delete(s,i,1); + // Btype i:=pos(',',s); if i=0 then begin closefile(fichier);exit;end; val(copy(s,1,i-1),valeur,erreur);if erreur<>0 then begin closefile(fichier);exit;end; tco[x,y].BType:=valeur; delete(s,1,i); + // Adresse i:=pos(',',s); if i=0 then begin closefile(fichier);exit;end; - val(copy(s,1,i-1),valeur,erreur);if erreur<>0 then begin closefile(fichier);exit;end; - tco[x,y].adresse:=valeur; + val(copy(s,1,i-1),adresse,erreur);if erreur<>0 then begin closefile(fichier);exit;end; + tco[x,y].adresse:=adresse; delete(s,1,i); + //Bimage i:=pos(',',s); if i=0 then begin closefile(fichier);exit;end; val(copy(s,1,i-1),valeur,erreur);if erreur<>0 then begin closefile(fichier);exit;end; tco[x,y].Bimage:=valeur; delete(s,1,i); - i:=pos(')',s); + // FeuOriente (pas encore stocké) + i:=pos(',',s); if i=0 then begin closefile(fichier);exit;end; - val(copy(s,1,i-1),valeur,erreur);if erreur<>0 then begin closefile(fichier);exit;end; - tco[x,y].FeuOriente:=valeur; + val(copy(s,1,i-1),FeuOriente,erreur);if erreur<>0 then begin closefile(fichier);exit;end; delete(s,1,i); - // si c'est un feu, remplir tableau FeuTCO - if tco[x,y].Bimage=12 then + // PiedFeu (pas encore stocké) + i:=pos(',',s); + if i=0 then begin closefile(fichier);exit;end; + val(copy(s,1,i-1),PiedFeu,erreur);if erreur<>0 then begin closefile(fichier);exit;end; + delete(s,1,i); + + // si c'est un feu, remplir tableau feux + if tco[x,y].Bimage=30 then begin inc(NbFeuTCO); // Affiche(intToSTR(tco[x,y].Adresse),clyellow); - FeuTCO[NbFeuTCO].Adresse:=tco[x,y].Adresse; - FeuTCO[NbFeuTCO].FeuOriente:=tco[x,y].FeuOriente; + i:=index_feu(adresse); + if i<>0 then + begin + aspect:=Feux[i].aspect; + // Affiche('Feu '+IntToSTR(Adresse)+' aspect='+intToSTR(aspect),clyellow); + Feux[i].indexTCO:=NbFeuTCO; + FeuTCO[NbFeuTCO].Aspect:=aspect; + end; + FeuTCO[NbFeuTCO].Adresse:=adresse; + FeuTCO[NbFeuTCO].FeuOriente:=FeuOriente; FeuTCO[NbFeuTCO].x:=x; FeuTCO[NbFeuTCO].y:=y; + FeuTCO[NbFeuTCO].PiedFeu:=PiedFeu; + + TCO[x,y].IndexFeu:=NbFeuTCO; + TCO[x,y].PiedFeu:=PiedFeu; end; + i:=pos(')',s); + if i<>1 then + tco[x,y].Texte:=copy(s,1,i-1) + else + tco[x,y].Texte:=''; + delete(s,1,i); inc(x); until s=''; @@ -320,11 +382,18 @@ end; procedure sauve_fichier_tco; var fichier : textfile; s : string; - x,y,erreur : integer; + x,y,i,erreur : integer; begin AssignFile(fichier,'tco.cfg'); rewrite(fichier); writeln(fichier,'/type(0=rien 1=voie/détecteur 2=aig 3=aigBis , adresse , image=1 à 10 ,orientation'); + writeln(fichier,'/ Taille de la matrice x,y'); + writeln(fichier,IntToSTR(NbreCellX)+','+intToSTR(NbreCellY)); + writeln(fichier,'/ Largeur et hauteur des cellules en pixels'); + writeln(fichier,'/ type,adresse,image,Orientation du feu, pied du feu'); + + writeln(fichier,IntToSTR(LargeurCell)+','+intToSTR(HauteurCell)); + writeln(fichier,'/Dalle TCO'); for y:=1 to NbreCellY do begin @@ -332,7 +401,15 @@ begin for x:=1 to NbreCellX do begin s:=s+'('+IntToSTR(TCO[x,y].BType)+','+Format('%.*d',[3,TCO[x,y].Adresse])+','+ - IntToSTR(TCO[x,y].BImage)+','+IntToSTR(TCO[x,y].FeuOriente)+')'; + IntToSTR(TCO[x,y].BImage)+','; + if TCO[x,y].BImage=30 then + begin + i:=TCO[x,y].IndexFeu; + s:=s+IntToSTR(FeuTCO[i].FeuOriente)+','+IntToSTR(TCO[x,y].PiedFeu)+','; + end + else s:=s+'0,0,'; + // texte + s:=s+TCO[x,y].Texte+')'; end; writeln(fichier,s); end; @@ -349,6 +426,8 @@ begin With PCanvasTCO do begin pen.color:=ClGrille; + Brush.Color:=Fond; + pen.mode:=PmCopy; // lignes verticales for x:=1 to NbreCellX do begin @@ -363,7 +442,7 @@ begin end; end; -// élément de voie horizontale +// élément de voie horizontale Element 1 procedure TFormTCO.dessin_voie(Canvas : Tcanvas;x,y : integer;couleur : TColor;Mode : TPenMode); var Adr, x0,y0,x1,y1,x2,y2,x3,y3,x4,y4,jy1,jy2 : integer; r : Trect; @@ -387,19 +466,22 @@ begin Brush.Color:=clWhite; pen.color:=couleur; Pen.Mode:=Mode; - jy1:=y0+(HauteurCell div 2)-6; // pos Y de la bande sup - jy2:=y0+(HauteurCell div 2)+6; // pos Y de la bande inf + jy1:=y0+(HauteurCell div 2)-round(6*frYGlob); // pos Y de la bande sup + jy2:=y0+(HauteurCell div 2)+round(6*frYGlob); // pos Y de la bande inf r:=Rect(x0,jy1,x0+LargeurCell,jy2); FillRect(r); + couleur:=clblue; end; end; Brush.Color:=couleur; pen.color:=couleur; - jy1:=y0+(HauteurCell div 2)-3; // pos Y de la bande sup - jy2:=y0+(HauteurCell div 2)+3; // pos Y de la bande inf + jy1:=y0+(HauteurCell div 2)-round(3*frYGlob); // pos Y de la bande sup + jy2:=y0+(HauteurCell div 2)+round(3*frYGlob); // pos Y de la bande inf r:=Rect(x0,jy1,x0+LargeurCell,jy2); FillRect(r); + + end; end; @@ -418,14 +500,10 @@ begin r:=Rect(x0,y0,x0+LargeurCell,y0+HauteurCell); FillRect(r); - x1:=x0; - y1:=y0+hauteurCell-3; - x2:=x0+largeurCell-3; - y2:=y0; - x3:=x0+largeurCell; - y3:=y0+4; - x4:=x0+4; - y4:=y0+hauteurCell; + x1:=x0;y1:=y0+hauteurCell-round(3*FryGlob); + x2:=x0+largeurCell-round(3*FrXGlob);y2:=y0; + x3:=x0+largeurCell;y3:=y0+round(4*FrYGlob); + x4:=x0+round(4*FrXGlob); y4:=y0+hauteurCell; Brush.Color:=couleur; pen.color:=couleur; @@ -449,14 +527,10 @@ begin r:=Rect(x0,y0,x0+LargeurCell,y0+HauteurCell); FillRect(r); - x1:=x0+3; - y1:=y0; - x2:=x0+largeurCell; - y2:=y0+HauteurCell-3; - x3:=x0+largeurCell-4; - y3:=y0+HauteurCell; - x4:=x0; - y4:=y0+4; + x1:=x0+round(3*FrXGlob);y1:=y0; + x2:=x0+largeurCell;y2:=y0+HauteurCell-round(3*FrYGlob); + x3:=x0+largeurCell-round(4*FrXGlob);y3:=y0+HauteurCell; + x4:=x0;y4:=y0+round(4*frYGlob); Brush.Color:=couleur; pen.color:=couleur; @@ -465,7 +539,7 @@ begin end; end; -// courbe bas gauche vers droit +// courbe bas gauche vers droit Elément 9 procedure TFormTCO.dessin_infG(Canvas : Tcanvas;x,y : integer;couleur : Tcolor;Mode : TPenMode); var jy1,jy2,x0,y0,i,x1,y1,x2,y2,x3,y3,x4,y4 : integer; r : Trect; @@ -483,25 +557,21 @@ begin pen.color:=Couleur; Pen.Mode:=Mode; - jy1:=y0+(HauteurCell div 2)-3; // pos Y de la bande sup - jy2:=y0+(HauteurCell div 2)+3; // pos Y de la bande inf + jy1:=y0+(HauteurCell div 2)-round(3*frYGlob); // pos Y de la bande sup + jy2:=y0+(HauteurCell div 2)+round(3*frYGlob); // pos Y de la bande inf r:=Rect(x0+(largeurCell div 2),jy1,x0+LargeurCell,jy2); FillRect(r); // brush.color:=clblue; - x1:=x0; - y1:=y0+HauteurCell-3; - x2:=x0+(LargeurCell div 2) -0; - y2:=jy1; - x3:=x0+(LargeurCell div 2) +2; - y3:=jy2; - x4:=x0+3; - y4:=y0+HauteurCell; - Polygon([point(x1-2,y1+2),Point(x2,y2),Point(x3,y3),Point(x4-2,y4+2)]); + x1:=x0; y1:=y0+HauteurCell-round(4*frYGlob); + x2:=x0+(LargeurCell div 2) ; y2:=jy1; + x3:=x0+(LargeurCell div 2) +round(2*frXGlob); y3:=jy2; + x4:=x0+round(4*frXGlob); y4:=y0+HauteurCell; + Polygon([point(x1,y1),Point(x2,y2),Point(x3,y3),Point(x4,y4)]); end; end; -// courbe: droit vers bas -\ +// courbe: droit vers bas -\ Element 8 procedure TFormTCO.dessin_infD(Canvas : Tcanvas;x,y : integer;couleur : Tcolor;Mode : TPenMode); var jy1,jy2,x0,y0,i,x1,y1,x2,y2,x3,y3,x4,y4 : integer; r : Trect; @@ -519,25 +589,23 @@ begin Pen.Mode:=Mode; pen.color:=Couleur; - jy1:=y0+(HauteurCell div 2)-3; // pos Y de la bande sup - jy2:=y0+(HauteurCell div 2)+3; // pos Y de la bande inf + jy1:=y0+(HauteurCell div 2)-round(3*frYGlob); // pos Y de la bande sup + jy2:=y0+(HauteurCell div 2)+round(3*frYGlob); // pos Y de la bande inf r:=Rect(x0,jy1,x0+(LargeurCell div 2),jy2); FillRect(r); // brush.color:=clblue; x1:=x0+(LargeurCell div 2) ; y1:=jy1; - x2:=x0+LargeurCell; - y2:=y0+HauteurCell-3; - x3:=x0+LargeurCell -2; - y3:=y0+HauteurCell; - x4:=x0+(LargeurCell div 2); - y4:=jy2; + x2:=x0+LargeurCell; y2:=y0+HauteurCell-round(3*frYGlob); + x3:=x0+LargeurCell -round(2*frXGlob); y3:=y0+HauteurCell; + x4:=x0+(LargeurCell div 2); y4:=jy2; Polygon([point(x1,y1),Point(x2,y2),Point(x3,y3),Point(x4,y4)]); end; end; +// Element 7 procedure TformTCO.dessin_SupD(Canvas : Tcanvas;x,y : integer; couleur : Tcolor;Mode : TPenMode); var x0,y0,x1,y1,x2,y2,x3,y3,x4,y4,jy1,jy2 : integer; r : Trect; @@ -551,28 +619,24 @@ begin FillRect(r); Brush.COlor:=Couleur; - pen.color:=Couleur; + pen.color:=couleur; Pen.Mode:=Mode; - jy1:=y0+(HauteurCell div 2)-3; // pos Y de la bande sup - jy2:=y0+(HauteurCell div 2)+3; // pos Y de la bande inf - r:=Rect(x0,jy1,x0+(LargeurCell div 2),jy2); + jy1:=y0+(HauteurCell div 2)-round(3*frYGlob); // pos Y de la bande sup + jy2:=y0+(HauteurCell div 2)+round(3*frYGlob); // pos Y de la bande inf + r:=Rect(x0,jy1,x0+(LargeurCell div 2)+4,jy2); FillRect(r); // brush.color:=clblue; - x1:=x0+(LargeurCell div 2); - y1:=jy1; - x2:=x0+LargeurCell-2; - y2:=y0; - x3:=x0+LargeurCell; - y3:=y0+2; - x4:=x0+(LargeurCell div 2); - y4:=jy2-2; - Polygon([point(x1-2,y1+2),Point(x2,y2),Point(x3,y3),Point(x4,y4)]); + x1:=x0+(LargeurCell div 2)+round(2*frXGlob);y1:=jy1; + x2:=x0+LargeurCell-round(2*frXGlob);y2:=y0; + x3:=x0+LargeurCell;y3:=y0+round(4*frYGlob); + x4:=x0+(LargeurCell div 2)+round(4*frXGlob);y4:=jy2-round(2*frYGlob); + Polygon([point(x1,y1),Point(x2,y2),Point(x3,y3),Point(x4,y4)]); end; end; -// coin supérieur gauche +// coin supérieur gauche (Element 6) procedure TformTCO.dessin_SupG(Canvas : Tcanvas;x,y : integer; couleur : Tcolor;Mode : TPenMode); var x0,y0,x1,y1,x2,y2,x3,y3,x4,y4,jy1,jy2 : integer; r : Trect; @@ -589,26 +653,235 @@ begin pen.color:=Couleur; Pen.Mode:=Mode; - jy1:=y0+(HauteurCell div 2)-3; // pos Y de la bande sup - jy2:=y0+(HauteurCell div 2)+3; // pos Y de la bande inf + jy1:=y0+(HauteurCell div 2)-round(3*frYGlob); // pos Y de la bande sup + jy2:=y0+(HauteurCell div 2)+round(3*frYGlob); // pos Y de la bande inf r:=Rect(x0+(LargeurCell div 2),jy1,x0+LargeurCell,jy2); FillRect(r); // brush.color:=clblue; - x1:=x0+(LargeurCell div 2); - y1:=jy2-2; - x2:=x0; - y2:=y0; - x3:=x0+3; - y3:=y0; - x4:=x0+(LargeurCell div 2); - y4:=jy1; + x1:=x0+(LargeurCell div 2)-round(1*frXGlob); y1:=jy2-round(2*frYGlob); + x2:=x0;y2:=y0+round(2*frYGlob); + x3:=x0+round(3*frXGlob);y3:=y0; + x4:=x0+(LargeurCell div 2);y4:=jy1; Polygon([point(x1,y1),Point(x2,y2),Point(x3,y3),Point(x4,y4)]); end; end; -// aiguillage pointe à gauche, aiguillage gauche -procedure TFormTCO.dessin_AigPG_AG(Canvas : Tcanvas;x,y : integer;couleur : Tcolor;Mode : TPenMode); +// Element 15 +procedure TFormTCO.dessin_Aig45PG_AD(Canvas : Tcanvas;x,y : integer;couleur : Tcolor;Mode : TPenMode;position : integer); +var x0,y0,x1,y1,x2,y2,x3,y3,x4,y4,jy1,jy2 : integer; + r : Trect; +begin + x0:=(x-1)*LargeurCell; + y0:=(y-1)*HauteurCell; + with canvas do + begin + Brush.Color:=Fond; + r:=Rect(x0,y0,x0+LargeurCell,y0+HauteurCell); + FillRect(r); + + x1:=x0;y1:=y0+hauteurCell-round(3*frYGlob); + x2:=x0+largeurCell-round(3*frXGlob);y2:=y0; + x3:=x0+largeurCell;y3:=y0+round(4*frYGlob); + x4:=x0+round(3*frYGlob);y4:=y0+hauteurCell; + + Brush.Color:=couleur; + pen.color:=couleur; + PolyGon([point(x1,y1),point(x2,y2),point(x3,y3),point(x4,y4)]); + + jy1:=y0+(HauteurCell div 2)-round(3*frYGlob); // pos Y de la bande sup + jy2:=y0+(HauteurCell div 2)+round(3*frYGlob); // pos Y de la bande inf + r:=Rect(x0+(LargeurCell div 2),jy1,x0+LargeurCell,jy2); + FillRect(r); + + // aiguillage dévié + if position=const_Devie then + begin + x1:=x0+round(20*frXGlob);y1:=jy1-round(1*frYGlob); + x2:=x1+round(23*frxGlob);y2:=y1; + x3:=x2;y3:=y2-round(3*frYGlob); + x4:=x1;y4:=y3; + pen.color:=fond; + Brush.Color:=fond; + Polygon([point(x1,y1),Point(x2,y2),Point(x3,y3),Point(x4,y4)]); + end; + + // aiguillage droit + if position=const_Droit then + begin + x1:=x0+round(34*frXGlob);y1:=jy1; + x2:=x1+round(6*frxGlob);y2:=y1; + x3:=x2-round(12*FrxGlob);y3:=y2+round(12*fryGlob); + x4:=x3-round(6*frxGlob);y4:=y3; + pen.color:=fond; + Brush.Color:=fond; + Polygon([point(x1,y1),Point(x2,y2),Point(x3,y3),Point(x4,y4)]); + end; + end; +end; + + +// Element 14 +procedure TFormTCO.dessin_Aig45PD_AG(Canvas : Tcanvas;x,y : integer;couleur : Tcolor;Mode : TPenMode;position : integer); +var x0,y0,x1,y1,x2,y2,x3,y3,x4,y4,jy1,jy2 : integer; + r : Trect; +begin + x0:=(x-1)*LargeurCell; + y0:=(y-1)*HauteurCell; + with canvas do + begin + Brush.Color:=Fond; + r:=Rect(x0,y0,x0+LargeurCell,y0+HauteurCell); + FillRect(r); + + x1:=x0+round(3*frXGlob); y1:=y0; + x2:=x0+largeurCell; y2:=y0+HauteurCell-round(3*fryGlob); + x3:=x0+largeurCell-round(4*frXGlob);y3:=y0+HauteurCell; + x4:=x0; y4:=y0+round(4*frYGlob); + + Brush.Color:=couleur; + pen.color:=couleur; + PolyGon([point(x1,y1),point(x2,y2),point(x3,y3),point(x4,y4)]); + + jy1:=y0+(HauteurCell div 2)-round(3*frYGlob); // pos Y de la bande sup + jy2:=y0+(HauteurCell div 2)+round(3*frYGlob); // pos Y de la bande inf + r:=Rect(x0,jy1,x0+(LargeurCell div 2),jy2); + FillRect(r); + + // aiguillage dévié + if position=const_Devie then + begin + x1:=x0+round(2*frXGlob);y1:=jy1-round(1*fryGlob); + x2:=x1+round(23*frxGlob);y2:=y1; + x3:=x2;y3:=y2-round(3*fryGlob); + x4:=x1;y4:=y3; + pen.color:=fond; + Brush.Color:=fond; + Polygon([point(x1,y1),Point(x2,y2),Point(x3,y3),Point(x4,y4)]); + end; + + // aiguillage droit + if position=const_Droit then + begin + x1:=x0+round(10*frXGlob);y1:=jy1; + x2:=x1+round(6*frxGlob);y2:=y1; + x3:=x2+round(12*FrxGlob);y3:=y2+round(12*fryGlob); + x4:=x3-round(5*frxGlob);y4:=y3; + pen.color:=fond; + Brush.Color:=fond; + Polygon([point(x1,y1),Point(x2,y2),Point(x3,y3),Point(x4,y4)]); + end; + end; +end; + +// Elément 13 +procedure TFormTCO.dessin_Aig45PD_AD(Canvas : Tcanvas;x,y : integer;couleur : Tcolor;Mode : TPenMode;position : integer); +var x0,y0,x1,y1,x2,y2,x3,y3,x4,y4,jy1,jy2 : integer; + r : Trect; +begin + x0:=(x-1)*LargeurCell; + y0:=(y-1)*HauteurCell; + with canvas do + begin + Brush.Color:=Fond; + r:=Rect(x0,y0,x0+LargeurCell,y0+HauteurCell); + FillRect(r); + + x1:=x0;y1:=y0+hauteurCell-round(3*frYGlob); + x2:=x0+largeurCell-round(3*frXGlob);y2:=y0; + x3:=x0+largeurCell;y3:=y0+round(4*FryGlob); + x4:=x0+round(4*frXGlob);y4:=y0+hauteurCell; + + Brush.Color:=couleur; + pen.color:=couleur; + PolyGon([point(x1,y1),point(x2,y2),point(x3,y3),point(x4,y4)]); + + jy1:=y0+(HauteurCell div 2)-round(3*frYGlob); // pos Y de la bande sup + jy2:=y0+(HauteurCell div 2)+round(3*frYGlob); // pos Y de la bande inf + r:=Rect(x0,jy1,x0+(LargeurCell div 2),jy2); + FillRect(r); + + // aiguillage dévié + if position=const_Devie then + begin + x1:=x0+round(12*frXGlob);y1:=jy2; + x2:=x1+round(20*frxGlob);y2:=y1; + x3:=x2;y3:=y2+round(3*frYGlob); + x4:=x1;y4:=y3; + pen.color:=fond; + Brush.Color:=fond; + Polygon([point(x1,y1),Point(x2,y2),Point(x3,y3),Point(x4,y4)]); + end; + + // aiguillage droit + if position=const_Droit then + begin + x1:=x0+round(18*frXGlob);y1:=jy1; + x2:=x1+round(5*frxGlob);y2:=y1; + x3:=x2-round(12*FrxGlob);y3:=y2+round(12*fryGlob); + x4:=x3-round(8*frxGlob);y4:=y3; + pen.color:=fond; + Brush.Color:=fond; + Polygon([point(x1,y1),Point(x2,y2),Point(x3,y3),Point(x4,y4)]); + end; + end; +end; + +// Element 12 aiguillage pointe 45°G vers droit +procedure TFormTCO.dessin_Aig45PG_AG(Canvas : Tcanvas;x,y : integer;couleur : Tcolor;Mode : TPenMode;position : integer); +var x0,y0,x1,y1,x2,y2,x3,y3,x4,y4,jy1,jy2 : integer; + r : Trect; +begin + x0:=(x-1)*LargeurCell; + y0:=(y-1)*HauteurCell; + with canvas do + begin + Brush.Color:=Fond; + r:=Rect(x0,y0,x0+LargeurCell,y0+HauteurCell); + FillRect(r); + + x1:=x0+round(3*frXGlob);y1:=y0; + x2:=x0+largeurCell;y2:=y0+HauteurCell-round(3*frYGlob); + x3:=x0+largeurCell-round(4*frXGlob); y3:=y0+HauteurCell; + x4:=x0; y4:=y0+round(4*frYGlob); + + Brush.Color:=couleur; + pen.color:=couleur; + PolyGon([point(x1,y1),point(x2,y2),point(x3,y3),point(x4,y4)]); + + jy1:=y0+(HauteurCell div 2)-round(3*frYGlob); // pos Y de la bande sup + jy2:=y0+(HauteurCell div 2)+round(3*frYGlob); // pos Y de la bande inf + r:=Rect(x0+(LargeurCell div 2),jy1,x0+LargeurCell,jy2); + FillRect(r); + + // aiguillage dévié + if position=const_Devie then + begin + x1:=x0+round(22*frxGlob);y1:=jy2; //+round(FrYGlob*1); + x2:=x1+round(12*frxGlob);y2:=y1; + x3:=x2;y3:=y2+3; + x4:=x1;y4:=y3; + pen.color:=fond; + Brush.COlor:=fond; + Polygon([point(x1,y1),Point(x2,y2),Point(x3,y3),Point(x4,y4)]); + end; + + // aiguillage droit + if position=const_Droit then + begin + x1:=x0+round(26*frXGlob);y1:=jy1; + x2:=x1+round(10*frxGlob);y2:=y1; + x3:=x2+round(12*FrxGlob);y3:=y2+round(12*fryGlob); + x4:=x3-round(10*frxGlob);y4:=y3; + pen.color:=fond; + Brush.COlor:=fond; + Polygon([point(x1,y1),Point(x2,y2),Point(x3,y3),Point(x4,y4)]); + end; + end; +end; + +// aiguillage pointe à gauche, aiguillage gauche Element 3 +procedure TFormTCO.dessin_AigPG_AG(Canvas : Tcanvas;x,y : integer;couleur : Tcolor;Mode : TPenMode;position : integer); var x0,y0,x1,y1,x2,y2,x3,y3,x4,y4,jy1,jy2 : integer; r : Trect; s : string; @@ -625,28 +898,47 @@ begin Brush.Color:=couleur; pen.color:=couleur; Pen.Mode:=Mode; - jy1:=y0+(HauteurCell div 2)-3; // pos Y de la bande sup - jy2:=y0+(HauteurCell div 2)+3; // pos Y de la bande inf + jy1:=y0+(HauteurCell div 2)-round(3*frYGlob); // pos Y de la bande sup + jy2:=y0+(HauteurCell div 2)+round(3*frYGlob); // pos Y de la bande inf r:=Rect(x0,jy1,x0+LargeurCell,jy2); FillRect(r); //brush.color:=clblue; - x1:=x0+(largeurCell div 2); - y1:=jy1; - x2:=x0+largeurCell-3; - y2:=y0; - x3:=x0+largeurCell; - y3:=y0+3; - x4:=x0+(largeurCell div 2)+7; - y4:=jy1; - Polygon([point(x1,y1),Point(x2,y2),Point(x3+2,y3-2),Point(x4+2,y4-2)]); + x1:=x0+(largeurCell div 2)+round(1*frXGlob); y1:=jy1; + x2:=x0+largeurCell-round(3*frXGlob); y2:=y0; + x3:=x0+largeurCell; y3:=y0+round(3*frYGlob); + x4:=x0+(largeurCell div 2)+round(1*frXGlob);y4:=jy2-round(1*frYGlob); + Polygon([point(x1,y1),Point(x2,y2),Point(x3,y3),Point(x4,y4)]); + + // aiguillage dévié + if position=const_Devie then + begin + x1:=x4+round(2*frXGlob);y1:=jy2-round(1*frYGlob); + x2:=x1+round(5*frXGlob);y2:=jy1; + x3:=x2+round(5*frXGlob);y3:=y2; + x4:=x1+round(5*frXGlob);y4:=y1; + pen.color:=fond; + Brush.COlor:=fond; + Polygon([point(x1,y1),Point(x2,y2),Point(x3,y3),Point(x4,y4)]); + end; + if position=const_Droit then + begin + // aiguillage droit + x1:=x1-1;y1:=jy1-1; + x2:=x1+10;y2:=y1; + x3:=x2;y3:=y2-3; + x4:=x1;y4:=y3; + pen.color:=fond; + Brush.COlor:=fond; + Polygon([point(x1,y1),Point(x2,y2),Point(x3,y3),Point(x4,y4)]); + end; end; end; -// aiguillage pointe à droite, aiguillage droit -procedure TFormTCO.dessin_AigPD_AD(Canvas : Tcanvas;x,y : integer;couleur : Tcolor;Mode : TPenMode); +// aiguillage pointe à droite, aiguillage droit Element 5 +procedure TFormTCO.dessin_AigPD_AD(Canvas : Tcanvas;x,y : integer;couleur : Tcolor;Mode : TPenMode;position : integer); var x0,y0,x1,y1,x2,y2,x3,y3,x4,y4,jy1,jy2 : integer; r : Trect; s : string; @@ -664,22 +956,47 @@ begin Pen.Mode:=Mode; pen.color:=couleur; - jy1:=y0+(HauteurCell div 2)-3; // pos Y de la bande sup - jy2:=y0+(HauteurCell div 2)+3; // pos Y de la bande inf + jy1:=y0+(HauteurCell div 2)-round(3*FrXGlob); // pos Y de la bande sup + jy2:=y0+(HauteurCell div 2)+round(3*FrYGlob); // pos Y de la bande inf r:=Rect(x0,jy1,x0+LargeurCell,jy2); //FillRect(r); Rectangle(r); //brush.color:=clblue; x1:=x0+(largeurCell div 2); y1:=jy1; - x2:=x0+3; y2:=y0; - x3:=x0; y3:=y0+3; - x4:=x0+(largeurCell div 2); y4:=jy2-1; - Polygon([point(x1,y1),Point(x2,y2),Point(x3,y3),Point(x4-1,y4-1)]); + x2:=x0+round(3*FrXGlob); y2:=y0; + x3:=x0; y3:=y0+round(3*FrYGlob); + x4:=x0+(largeurCell div 2)-round(1*FrXGlob); y4:=jy2-round(1*FrYGlob); + Polygon([point(x1,y1),Point(x2,y2),Point(x3,y3),Point(x4,y4)]); + + // aiguillage dévié + if position=const_Devie then + begin + x1:=x1-12;y1:=jy1; + x2:=x1+5;y2:=jy2-1; + x3:=x2+6;y3:=y2; + x4:=x1+6;y4:=y1; + pen.color:=fond; + Brush.COlor:=fond; + Polygon([point(x1,y1),Point(x2,y2),Point(x3,y3),Point(x4,y4)]); + end; + + // aiguillage droit + if position=const_Droit then + begin + x1:=x4-10;y1:=jy1-1; + x2:=x1+10;y2:=y1; + x3:=x2;y3:=y2-3; + x4:=x1;y4:=y3; + pen.color:=fond; + Brush.COlor:=fond; + Polygon([point(x1,y1),Point(x2,y2),Point(x3,y3),Point(x4,y4)]); + end; end; end; -procedure TformTCO.dessin_AigG_PD(canvas : Tcanvas;x,y : integer; couleur : Tcolor;Mode : TPenMode); +// element 2 +procedure TformTCO.dessin_AigG_PD(canvas : Tcanvas;x,y : integer; couleur : Tcolor;Mode : TPenMode; position : integer); var x0,y0,x1,y1,x2,y2,x3,y3,x4,y4,jy1,jy2 : integer; r : Trect; s : string; @@ -698,22 +1015,45 @@ begin pen.color:=couleur; // bande horizontale - jy1:=y0+(HauteurCell div 2)-3; // pos Y de la bande sup - jy2:=y0+(HauteurCell div 2)+3; // pos Y de la bande inf + jy1:=y0+(HauteurCell div 2)-round(3*frYGlob); // pos Y de la bande sup + jy2:=y0+(HauteurCell div 2)+round(3*frYGlob); // pos Y de la bande inf r:=Rect(x0,jy1,x0+LargeurCell,jy2); FillRect(r); // déviation - x1:=x0+(largeurCell div 2); y1:=jy1+1; - x2:=x0;y2:=y0+HauteurCell-2; - x3:=x0+1;y3:=y0+HauteurCell; - x4:=x1;y4:=jy2; - Polygon([point(x1,y1),Point(x2,y2),Point(x3,y3),Point(x4-1,y4-1)]); + x1:=x0+(largeurCell div 2); y1:=jy1+round(1*frYGlob); + x2:=x0-round(1*FrXGlob);y2:=y0+HauteurCell-round(2*FrYGlob); + x3:=x0+round(2*FrXGlob);y3:=y0+HauteurCell; + x4:=x1+round(1*FrXGlob);y4:=jy2; + Polygon([point(x1,y1),Point(x2,y2),Point(x3,y3),Point(x4,y4)]); + + // aiguillage dévié + if position=const_Devie then + begin + x1:=x1;y1:=jy1; + x2:=x1-6;y2:=jy2; + x3:=x2-6;y3:=y2; + x4:=x1-6;y4:=jy1; + pen.color:=fond; + Brush.COlor:=fond; + Polygon([point(x1,y1),Point(x2,y2),Point(x3,y3),Point(x4,y4)]); + end; + if position=const_Droit then + begin + // aiguillage droit + x1:=x1+3;y1:=jy2; + x2:=x1-10;y2:=y1; + x3:=x2-5;y3:=y2+3; + x4:=x1-5;y4:=y3; + pen.color:=fond; + Brush.COlor:=fond; + Polygon([point(x1,y1),Point(x2,y2),Point(x3,y3),Point(x4,y4)]); + end; end; end; - -procedure TformTCO.dessin_AigD_PG(Canvas : Tcanvas;x,y : integer; couleur : Tcolor;Mode : TPenMode); +// Element 4 +procedure TformTCO.dessin_AigD_PG(Canvas : Tcanvas;x,y : integer; couleur : Tcolor;Mode : TPenMode;position : integer); var x0,y0,x1,y1,x2,y2,x3,y3,x4,y4,jy1,jy2 : integer; r : Trect; s : string; @@ -732,92 +1072,103 @@ begin pen.color:=couleur; // bande horizontale - jy1:=y0+(HauteurCell div 2)-3; // pos Y de la bande sup - jy2:=y0+(HauteurCell div 2)+3; // pos Y de la bande inf + jy1:=y0+(HauteurCell div 2)-round(3*frYGlob); // pos Y de la bande sup + jy2:=y0+(HauteurCell div 2)+round(3*frYGlob); // pos Y de la bande inf r:=Rect(x0,jy1,x0+LargeurCell,jy2); FillRect(r); // déviation - x1:=x0+(largeurCell div 2); y1:=jy1+1; - x2:=x0+largeurCell;y2:=y0+HauteurCell-2; - x3:=x0+largeurCell-3;y3:=y0+HauteurCell; - x4:=x0+(largeurCell div 2);y4:=jy2; - Polygon([point(x1,y1),Point(x2,y2),Point(x3,y3),Point(x4-1,y4-1)]); + x1:=x0+(largeurCell div 2)+round(1*frXGlob); y1:=jy1+round(1*frYGlob); + x2:=x0+largeurCell;y2:=y0+HauteurCell-round(3*frYGlob); + x3:=x0+largeurCell-round(3*frXGlob);y3:=y0+HauteurCell; + x4:=x0+(largeurCell div 2)-round(1*frXGlob);y4:=jy2-round(1*frYGlob); + Polygon([point(x1,y1),Point(x2,y2),Point(x3,y3),Point(x4,y4)]); + + // aiguillage dévié + if position=const_Devie then + begin + x1:=x1;y1:=jy1; + x2:=x1+5;y2:=jy2-1; + x3:=x2+6;y3:=y2; + x4:=x1+6;y4:=y1; + pen.color:=fond; + Brush.COlor:=fond; + Polygon([point(x1,y1),Point(x2,y2),Point(x3,y3),Point(x4,y4)]); + end; + + if position=const_Droit then + begin + // aiguillage droit + x1:=x4;y1:=jy2; + x2:=x1+10;y2:=y1; + x3:=x2;y3:=y2+3; + x4:=x1;y4:=y3; + pen.color:=fond; + Brush.COlor:=fond; + Polygon([point(x1,y1),Point(x2,y2),Point(x3,y3),Point(x4,y4)]); + end; end; end; -// Affiche dans le TCO en x,y un Feu à 90° d'après l'image transmise -// x y en coordonnées grille (cellule) -procedure Feu_90G(ImageSource : TImage;x,y : integer); -var p : array[0..2] of TPoint; - x0,y0,HtFeu,LgFeu : integer; +// calcul des facteurs de réductions X et Y pour l'adapter à l'image de destination +procedure calcul_reduction(Var frx,fry : real;DimDestX,DimDestY,DimOrgX,DimOrgY : integer); begin - x0:=(x-2)*LargeurCell; - y0:=(y-1)*HauteurCell; - HtFeu:=ImageSource.Picture.Height; - lgFeu:=ImageSource.Picture.Width; - // Affiche('Taille X feu_90G='+IntToSTR(lgFeu),clLime); - //PImageTCO.Picture.Bitmap.TransparentMode:=tmFixed; // tmAuto; - //PImageTCO.Picture.Bitmap.TransparentColor:=clBlue; - //PImageTCO.Transparent:=true; + frX:=DimDestX/DimOrgX; + frY:=DimDestY/DimOrgY; +end; + +// Affiche dans le TCO en x,y un Feu à 90° d'après l'image transmise +// x y en coordonnées pixels +procedure Feu_90G(ImageSource : TImage;x,y : integer;FrX,FrY : real); +var p : array[0..2] of TPoint; + TailleY,TailleX : integer; +begin + TailleY:=ImageSource.Picture.Height; + TailleX:=ImageSource.Picture.Width; + //offset:=2*largeurCell-TailleX; + // Affiche(intToSTR(offset),clyellow); + // copie à 90°G sans mise à l'échelle dans l'image provisoire - p[0].X:=HtFeu; //90; + p[0].X:=TailleY; //90; p[0].Y:=0; //0; - p[1].X:=HtFeu; //90; - p[1].Y:=LgFeu; //49; + p[1].X:=TailleY; //90; + p[1].Y:=TailleX; //49; p[2].X:=0; //0; p[2].Y:=0; //0; - PlgBlt(PImageTemp.Canvas.Handle,p,ImageSource.Canvas.Handle,0,0,lgFeu,HtFeu,0,0,0); - PImageTemp.Picture.Bitmap.Modified:=True; - //PlgBlt(PImageTemp.Canvas.Handle,p,formprinc.Image5feux.Canvas.Handle,0,0,49,90,0,0,0); - // et copier l'image tournée sur le TCO - //StretchBlt(PcanvasTCO.Handle,x0,y0,LargeurCell*2,HauteurCell, - // PImageTemp.Canvas.Handle,0,0,HtFeu,LgFeu,srccopy); - TransparentBlt(PcanvasTCO.Handle,x0,y0,LargeurCell*2,HauteurCell, - PImageTemp.Canvas.Handle,0,0,HtFeu,LgFeu,clBlue); // clblue est la couleur de transparence + // copie l'image du feu depuis imagesource vers image temporaire à la même échelle mais retournée à 90° + PlgBlt(PImageTemp.Canvas.Handle,p,ImageSource.Canvas.Handle,0,0,TailleX,TailleY,0,0,0); + + // copie l'image du feu retournée depuis image temporaire vers tco avec une réduction en mode transparennt + TransparentBlt(PcanvasTCO.Handle,x,y,round(TailleY*FrY),round(TailleX*FrX), // destination + PImageTemp.Canvas.Handle,0,0,TailleY,TailleX,clBlue); // source - clblue est la couleur de transparence PImageTCO.Picture.Bitmap.Modified:=True; // rafraichit l'affichage sinon le stretchblt n'apparaît pas. end; // copie de l'image du feu à 90° dans le canvas source et le tourne de 90° et le met dans l'image temporaire -procedure Feu_90D(ImageSource : TImage;x,y : integer); +procedure Feu_90D(ImageSource : TImage;x,y : integer ; FrX,FrY : real); var p : array[0..2] of TPoint; - x0,y0,HtFeu,LgFeu : integer; + x0,y0,TailleY,TailleX : integer; begin - x0:=(x-1)*LargeurCell; - y0:=(y-1)*HauteurCell; - HtFeu:=ImageSource.Picture.Height; - lgFeu:=ImageSource.Picture.Width; + TailleY:=ImageSource.Picture.Height; + TailleX:=ImageSource.Picture.Width; + // copie à 90°D dans l'image provisoire p[0].X:=0; - p[0].Y:=LgFeu; //49; + p[0].Y:=TailleX; //49; p[1].X:=0; p[1].Y:=0; - p[2].X:=HtFeu; //90; - p[2].Y:=LgFeu; //49; - PlgBlt(PImageTemp.Canvas.Handle,p,ImageSource.Canvas.Handle,0,0,LgFeu,HtFeu,0,0,0); - PImageTemp.Picture.Bitmap.Modified:=True; + p[2].X:=TailleY; //90; + p[2].Y:=TailleX; //49; + // copie l'image du feu depuis imagesource vers image temporaire à la même échelle mais retournée à 90° + PlgBlt(PImageTemp.Canvas.Handle,p,ImageSource.Canvas.Handle,0,0,TailleX,TailleY,0,0,0); + // et copier l'image avec mise à l'échelle tournée sur le TCO - TransparentBlt(PcanvasTCO.Handle,x0,y0,LargeurCell*2,HauteurCell, - PImageTemp.Canvas.Handle,0,0,HtFeu,LgFeu,clBlue); + TransparentBlt(PcanvasTCO.Handle,x,y,round(tailleY*FrY),round(tailleX*FrX), + PImageTemp.Canvas.Handle,0,0,TailleY,TailleX,clBlue); PImageTCO.Picture.Bitmap.Modified:=True; // rafraichit l'affichage sinon le stretchblt n'apparaît pas. end; - // copie de l'image du feu à 180° depuis le canvas source et le met dans l'image temporaire -procedure Feu_180(CanvasSource : TCanvas); -var src,dest : Trect; -begin - dest:=bounds(0, 0, 49, 90); - src:=rect(0, 0, 49, 90); // V flip - - // dest:=bounds(0, 0, image1.Picture.Width, image1.Picture.Height); - //src:=rect(0, image1.Picture.Height-1, image1.Picture.Width-1, 0); // Vertical flip - - //src:=rect(image1.Picture.Width-1, 0, 0, image1.Picture.Height-1); // Horizontal flip - //src:=rect(image1.Picture.Width-1, image1.Picture.Height-1, 0, 0); // Both flip - PimageTemp.Picture.Bitmap.Canvas.StretchDraw(dest,Formprinc.Image9feux.Picture.Graphic); - PImageTemp.Picture.Bitmap.Modified:=True; -end; // renvoie un pointeur vers l'image du feu suivant l'aspect du feu de adresse // ne marche pas @@ -829,6 +1180,7 @@ begin i:=Index_feu(adresse); aspect:=feux[i].aspect; + pim:=nil; case aspect of 2 : Pim:=Formprinc.Image2feux; 3 : Pim:=Formprinc.Image3feux; @@ -841,7 +1193,6 @@ begin PointeurImage:=Pim; end; -// provisoire procedure cercle(ACanvas : Tcanvas;x,y,rayon : integer;couleur : Tcolor); begin with PCanvasTCO do @@ -851,23 +1202,270 @@ with PCanvasTCO do end; end; +procedure affiche_pied2G_90G(x,y : integer;FrX,frY : real); +var x1,y1 : integer; + ech : real; +begin + ech:=frY;frY:=frX;FrX:=ech; + with PcanvasTCO do + begin + Pen.Color:=clOrange; + x1:=0;y1:=12; + moveTo( x+round((x1)*frX),y+round(y1*frY) ); + LineTo( x+round((x1-7)*frX),y+round((y1+0)*frY) ); + LineTo( x+round((x1-7)*frX),y+round((y1+35)*frY) ); + + moveTo( x+round((x1)*frX),y+round((y1+1)*frY) ); + LineTo( x+round((x1-6)*frX),y+round((y1+1)*frY) ); + LineTo( x+round((x1-6)*frX),y+round((y1+35)*frY) ); + end; +end; + +procedure affiche_pied2G_90D(x,y : integer;FrX,frY : real); +var x1,y1 : integer; + ech : real; +begin + ech:=frY;frY:=frX;FrX:=ech; + with PcanvasTCO do + begin + Pen.Color:=clOrange; + x1:=35;y1:=12; + moveTo( x+round((x1)*frX),y+round(y1*frY) ); + LineTo( x+round((x1+7)*frX),y+round((y1+0)*frY) ); + LineTo( x+round((x1+7)*frX),y+round((y1-35)*fry) ); + + moveTo( x+round((x1)*frX),y+round((y1+1)*frY) ); + LineTo( x+round((x1+6)*frX),y+round((y1+1)*frY) ); + LineTo( x+round((x1+6)*frX),y+round((y1-35)*fry) ); + end; +end; + +procedure affiche_pied3G_90D(x,y : integer;FrX,frY : real); +var x1,y1 : integer; + ech : real; +begin + ech:=frY;frY:=frX;FrX:=ech; + with PcanvasTCO do + begin + Pen.Color:=clOrange; + x1:=45;y1:=12; + moveTo( x+round((x1)*frX),y+round(y1*frY) ); + LineTo( x+round((x1+7)*frX),y+round((y1+0)*frY) ); + LineTo( x+round((x1+7)*frX),y+round((y1-35)*fry) ); + + moveTo( x+round((x1)*frX),y+round((y1+1)*frY) ); + LineTo( x+round((x1+6)*frX),y+round((y1+1)*frY) ); + LineTo( x+round((x1+6)*frX),y+round((y1-35)*fry) ); + end; +end; + +procedure affiche_pied3G_90G(x,y : integer;FrX,frY : real); +var x1,y1 : integer; + ech : real; +begin + ech:=frY;frY:=frX;FrX:=ech; + with PcanvasTCO do + begin + Pen.Color:=clOrange; + x1:=0;y1:=12; + moveTo( x+round((x1)*frX),y+round(y1*frY) ); + LineTo( x+round((x1-7)*frX),y+round((y1+0)*frY) ); + LineTo( x+round((x1-7)*frX),y+round((y1+35)*frY) ); + + moveTo( x+round((x1)*frX),y+round((y1+1)*frY) ); + LineTo( x+round((x1-6)*frX),y+round((y1+1)*frY) ); + LineTo( x+round((x1-6)*frX),y+round((y1+35)*frY) ); + end; +end; + +procedure affiche_pied4G_90G(x,y : integer;FrX,frY : real); +var x1,y1 : integer; +begin + with PcanvasTCO do + begin + Pen.Color:=clOrange; + x1:=0;y1:=12; + moveTo( x+round((x1)*frX),y+round(y1*frY) ); + LineTo( x+round((x1-7)*frX),y+round((y1+0)*frY) ); + LineTo( x+round((x1-7)*frX),y+round((y1+35)*frY) ); + + moveTo( x+round((x1)*frX),y+round((y1+1)*frY) ); + LineTo( x+round((x1-6)*frX),y+round((y1+1)*frY) ); + LineTo( x+round((x1-6)*frX),y+round((y1+35)*frY) ); + end; +end; + +procedure affiche_pied4G_90D(x,y : integer;FrX,frY : real); +var x1,y1 : integer; + ech : real; +begin + ech:=frY;frY:=frX;FrX:=ech; + with PcanvasTCO do + begin + Pen.Color:=clOrange; + x1:=55;y1:=12; + moveTo( x+round(x1*frX),y+round(y1*frY) ); + LineTo( x+round((x1+7)*frX),y+round((y1+0)*frY) ); + LineTo( x+round((x1+7)*frX),y+round((y1-35)*fry) ); + + moveTo( x+round((x1)*frX),y+round((y1+1)*frY) ); + LineTo( x+round((x1+6)*frX),y+round((y1+1)*frY) ); + LineTo( x+round((x1+6)*frX),y+round((y1-35)*fry) ); + end; +end; + +procedure affiche_pied5G_90D(x,y : integer;FrX,frY : real); +var x1,y1 : integer; + ech : real; +begin + ech:=frY;frY:=frX;FrX:=ech; + with PcanvasTCO do + begin + Pen.Color:=clOrange; + x1:=66;y1:=12; + moveTo( x+round((x1)*frX),y+round(y1*frY) ); + LineTo( x+round((x1+7)*frX),y+round((y1+0)*frY) ); + LineTo( x+round((x1+7)*frX),y+round((y1-35)*fry) ); + + moveTo( x+round((x1)*frX),y+round((y1+1)*frY) ); + LineTo( x+round((x1+6)*frX),y+round((y1+1)*frY) ); + LineTo( x+round((x1+6)*frX),y+round((y1-35)*fry) ); + end; +end; + +procedure affiche_pied5G_90G(x,y : integer;FrX,frY : real); +var x1,y1 : integer; + ech : real; +begin + ech:=frY;frY:=frX;FrX:=ech; + with PcanvasTCO do + begin + Pen.Color:=clOrange; + x1:=0;y1:=12; + moveTo( x+round((x1)*frX),y+round(y1*frY) ); + LineTo( x+round((x1-7)*frX),y+round((y1+0)*frY) ); + LineTo( x+round((x1-7)*frX),y+round((y1+35)*frY) ); + + moveTo( x+round((x1)*frX),y+round((y1+1)*frY) ); + LineTo( x+round((x1-6)*frX),y+round((y1+1)*frY) ); + LineTo( x+round((x1-6)*frX),y+round((y1+35)*frY) ); + end; +end; + +procedure affiche_pied7G_90D(x,y : integer;FrX,frY : real); +var x1,y1 : integer; + ech : real; +begin + ech:=frY;frY:=frX;FrX:=ech; + with PcanvasTCO do + begin + Pen.Color:=clOrange; + x1:=75;y1:=38; + moveTo( x+round((x1)*frX),y+round(y1*frY) ); + LineTo( x+round((x1+7)*frX),y+round((y1+0)*frY) ); + LineTo( x+round((x1+7)*frX),y+round((y1-60)*fry) ); + + moveTo( x+round((x1)*frX),y+round((y1+1)*frY) ); + LineTo( x+round((x1+6)*frX),y+round((y1+1)*frY) ); + LineTo( x+round((x1+6)*frX),y+round((y1-60)*fry) ); + end; +end; + +procedure affiche_pied7G_90G(x,y : integer;FrX,frY : real); +var x1,y1 : integer; + ech : real; +begin + ech:=frY;frY:=frX;FrX:=ech; + with PcanvasTCO do + begin + Pen.Color:=clOrange; + x1:=0;y1:=12; + moveTo( x+round((x1)*frX),y+round(y1*frY) ); + LineTo( x+round((x1-7)*frX),y+round((y1+0)*frY) ); + LineTo( x+round((x1-7)*frX),y+round((y1+70-12)*frY) ); + + moveTo( x+round((x1)*frX),y+round((y1+1)*frY) ); + LineTo( x+round((x1-6)*frX),y+round((y1+1)*frY) ); + LineTo( x+round((x1-6)*frX),y+round((y1+70-13)*frY) ); + end; +end; + +procedure affiche_pied9G_90D(x,y : integer;FrX,frY : real); +var x1,y1 : integer; + var ech : real; +begin + ech:=frY;frY:=frX;FrX:=ech; + with PcanvasTCO do + begin + Pen.Color:=clOrange; + x1:=90;y1:=38; + moveTo( x+round((x1)*frX),y+round(y1*frY) ); + LineTo( x+round((x1+7)*frX),y+round((y1+0)*frY) ); + LineTo( x+round((x1+7)*frX),y+round((y1-60)*fry)); + + moveTo( x+round((x1)*frX),y+round((y1+1)*frY) ); + LineTo( x+round((x1+6)*frX),y+round((y1+1)*frY) ); + LineTo( x+round((x1+6)*frX),y+round((y1-60)*fry) ); + end; +end; + +procedure affiche_pied9G_90G(x,y : integer;FrX,frY : real); +var x1,y1 : integer; + ech : real; +begin + ech:=frY;frY:=frX;FrX:=ech; + with PcanvasTCO do + begin + Pen.Color:=clOrange; + x1:=0;y1:=12; + moveTo( x+round((x1)*frX),y+round(y1*frY) ); + LineTo( x+round((x1-7)*frX),y+round((y1+0)*frY) ); + LineTo( x+round((x1-7)*frX),y+round((y1+70-12)*frY) ); + + moveTo( x+round((x1)*frX),y+round((y1+1)*frY) ); + LineTo( x+round((x1-6)*frX),y+round((y1+1)*frY) ); + LineTo( x+round((x1-6)*frX),y+round((y1+70-13)*frY) ); + end; +end; + +procedure affiche_pied_VerticalG(x,y : integer;FrX,frY : real); +var x1,y1 : integer; +begin + with PcanvasTCO do + begin + Pen.Color:=clOrange; + x1:=12;y1:=90; + moveTo( x+round((x1+0)*frX),y+round(y1*frY) ); + LineTo( x+round((x1+0)*frX),y+round((y1+7)*frY) ); + LineTo( x+round((x1+50-12)*frX),y+round((y1+7)*frY) ); + + moveTo( x+round((x1+1)*frX),y+round((y1+0)*frY) ); + LineTo( x+round((x1+1)*frX),y+round((y1+8)*frY) ); + LineTo( x+round((x1+50-12)*frX),y+round((y1+8)*frY) ); + + end; +end; + // Dessine un feu dans le canvas en x,y , dont l'adresse se trouve à la cellule x,y procedure dessin_feu(CanvasDest : Tcanvas;x,y : integer; couleur : Tcolor;Mode : TPenMode); -var x0,y0,orientation,adresse,i,aspect,TailleX,TailleY : integer; +var OffsetX,x0,y0,orientation,adresse,i,aspect,TailleX,TailleY,NbCellDest : integer; ImageFeu : Timage; frX,frY : real; begin x0:=(x-1)*LargeurCell; y0:=(y-1)*HauteurCell; - - Orientation:=TCO[x,y].FeuOriente; + Adresse:=TCO[x,y].Adresse; - if adresse=0 then exit; - i:=Index_feu(adresse); - if i=0 then exit; - aspect:=feux[i].aspect; + //if adresse=0 then exit; + + i:=TCO[x,y].indexfeu; + Orientation:=feuTCO[i].FeuOriente; + if Orientation=0 then Orientation:=1; // cas d'un feu non encore renseigné + + aspect:=feuTCO[i].aspect; //Affiche(IntToSTR(i)+' '+intToSTR(aspect),clred); - + + offsetX:=0; case aspect of 2 : ImageFeu:=Formprinc.Image2feux; 3 : ImageFeu:=Formprinc.Image3feux; @@ -875,60 +1473,69 @@ begin 5 : ImageFeu:=Formprinc.Image5feux; 7 : ImageFeu:=Formprinc.Image7feux; 9 : ImageFeu:=Formprinc.Image9feux; - else ImageFeu:=Formprinc.Image3feux; + else ImageFeu:=Formprinc.Image9feux; end; - //ImageFeu:=PointeurImage(adresse); // pointeur vers le type de feu à dessiner + TailleX:=ImageFeu.picture.BitMap.Width; TailleY:=ImageFeu.picture.BitMap.Height; // taille du feu d'origine (verticale) - TailleX:=ImageFeu.picture.BitMap.Width; // - //Facteurs de réductions X et Y pour un signal vertical - frX:=LargeurCell/TailleX; - frY:=2*HauteurCell/TailleY; - //Affiche('FrX='+floatToSTR(frX)+' FrY='+floatToSTR(frY),clyellow); + // réduction variable en fonction de la taille des cellules. 50 est le Zoom Maxi + calcul_reduction(frx,fry,round(TailleX*LargeurCell/ZoomMax),round(tailleY*HauteurCell/ZoomMax),TailleX,TailleY); - // affiche l'icône du signal--------------- - if (Orientation=1) then + // décalage en X pour mettre la tete du feu alignée sur le bord droit de la cellule pour les feux tournés à 90G + if orientation=2 then begin - //Affiche('Adresse='+intToSTR(Adresse)+' Xfeu='+IntToSTR(X0)+' Yfeu='+intToSTR(y0),clyellow); - TransparentBlt(canvasDest.Handle,x0,y0,LargeurCell,HauteurCell*2, + if aspect=9 then x0:=x0+round(10*frX); + if aspect=7 then x0:=x0+round(10*frX); + if aspect=5 then begin x0:=x0+round(10*frX); y0:=y0+HauteurCell-round(tailleX*frY); end; + if aspect=4 then begin x0:=x0+round(10*frX); y0:=y0+HauteurCell-round(tailleX*frY); end; + if aspect=3 then begin x0:=x0+round(10*frX); y0:=y0+HauteurCell-round(tailleX*frY); end; + if aspect=2 then begin x0:=x0+round(10*frX); y0:=y0+HauteurCell-round(tailleX*frY); end; + end; + + // orientation verticale + if (Orientation=1) then + begin + // copie avec mise à l'échelle + TransparentBlt(canvasDest.Handle,x0,y0,round(TailleX*frX),round(TailleY*frY), ImageFeu.Canvas.Handle,0,0,TailleX,TailleY,clBlue); PImageTCO.Picture.Bitmap.Modified:=True; // rafraichit l'affichage sinon le stretchblt n'apparaît pas. + if aspect=9 then affiche_pied_VerticalG(x0,y0,frX,frY); end; + + // orientation 90°G if Orientation=2 then begin - Feu_90G(ImageFeu,x,y); // ici on passe l'origine du feu - x0:=x0-largeurCell; - //Affiche('Adresse='+intToSTR(Adresse)+' Xfeu='+IntToSTR(X0)+' Yfeu='+intToSTR(y0),clyellow); - // y0:=y0+largeurCell; + Feu_90G(ImageFeu,x0,y0,frX,frY); // ici on passe l'origine du feu + // dessiner le pied + case aspect of + 9 : affiche_pied9G_90G(x0,y0,frX,frY); + 7 : affiche_pied7G_90G(x0,y0,frX,frY); + 5 : affiche_pied5G_90G(x0,y0,frX,frY); + 4 : affiche_pied4G_90G(x0,y0,frX,frY); + 3 : affiche_pied3G_90G(x0,y0,frX,frY); + 2 : affiche_pied2G_90G(x0,y0,frX,frY); + end; + end; + + // orientation 90°D if Orientation=3 then begin - Feu_90D(ImageFeu,x,y); + Feu_90D(ImageFeu,x0,y0,frX,frY); + // dessiner le pied + case aspect of + 9 : affiche_pied9G_90D(x0,y0,frX,frY); + 7 : affiche_pied7G_90D(x0,y0,frX,frY); + 5 : affiche_pied5G_90D(x0,y0,frX,frY); + 4 : affiche_pied4G_90D(x0,y0,frX,frY); + 3 : affiche_pied3G_90D(x0,y0,frX,frY); + 2 : affiche_pied2G_90D(x0,y0,frX,frY); + end; end; - // écrire le texte ------------------ - with PcanvasTCO do - begin - font.Size:=5; - Brush.Color:=fond; - Font.Color:=CouleurAdresse; - if Aspect=9 then TextOut(x0-LargeurCell,y0+8,IntToSTR(Adresse)) - else TextOut(x0+1,y0+8,IntToSTR(Adresse)); - end; - - - dessine_feu_mx(canvasDest,x0,y0,frX,frY,adresse,orientation); // allumage des feux du signal ----------------- - (* - case aspect of - 2 : dessine_feu2(canvasDest,x0,y0,frX,frY,etatsignalcplx[adresse],orientation); - 3 : dessine_feu3(canvasDest,x0,y0,frX,frY,etatsignalcplx[adresse],orientation); - 4 : dessine_feu4(canvasDest,x0,y0,frX,frY,etatsignalcplx[adresse],orientation); - 5 : dessine_feu5(canvasDest,x0,y0,frX,frY,etatsignalcplx[adresse],orientation); - 7 : dessine_feu7(canvasDest,x0,y0,frX,frY,etatsignalcplx[adresse],orientation); - 9 : dessine_feu_mx(canvasDest,x0,y0,frX,frY,etatsignalcplx[adresse],orientation); - end; *) + dessine_feu_mx(canvasDest,x0,y0,frX,frY,adresse,orientation); end; procedure TFormTCO.Efface_Cellule(Canvas : Tcanvas;x,y : integer; couleur : Tcolor;Mode : TPenMode); @@ -938,12 +1545,12 @@ begin if y>1 then begin // si la cellule au dessus contient un feu vertical, ne pas effacer la cellule - if (tco[x,y-1].BImage=12) and (tco[x,y-1].FeuOriente=1) then exit; + // if (tco[x,y-1].BImage=12) and (tco[x,y-1].FeuOriente=1) then exit; end; if x=2) and (btype<=14) then pos:=Aiguillage[adresse].position; + Xorg:=(x-1)*LargeurCell; Yorg:=(y-1)*HauteurCell; - s:=IntToSTR(i); + s:=IntToSTR(adresse); if Btype=2 then s:='A'+s; if Btype=3 then s:='A'+s+'B'; - if y>1 then if (tco[x,y-1].Bimage=12) and (tco[x,y-1].FeuOriente=1) then exit; + i:=Tco[x,y].IndexFeu; + + if y>1 then if (tco[x,y-1].Bimage=30) and (FeuTCO[i].FeuOriente=1) then exit; case Bimage of - // ne pas passer la forme ds le paramètre canvas, çà ne s'affichera pas // 0 : efface_cellule(PCanvasTCO,x,y,Clyellow,Mode); &&&&&&&&& - 1 : dessin_AigPD_AD(PCanvasTCO,X,Y,Clyellow,Mode); - 2 : dessin_AigG_PD(PCanvasTCO,X,Y,Clyellow,mode); - 3 : dessin_AigPG_AG(PCanvasTCO,X,Y,Clyellow,mode); - 4 : dessin_AigD_PG(PCanvasTCO,X,Y,Clyellow,Mode); - 5 : dessin_voie(PCanvasTCO,X,Y,Clyellow,Mode); + 1 : dessin_voie(PCanvasTCO,X,Y,Clyellow,Mode); + 2 : dessin_AigG_PD(PCanvasTCO,X,Y,Clyellow,mode,pos); + 3 : dessin_AigPG_AG(PCanvasTCO,X,Y,Clyellow,mode,pos); + 4 : dessin_AigD_PG(PCanvasTCO,X,Y,Clyellow,Mode,pos); + 5 : dessin_AigPD_AD(PCanvasTCO,X,Y,Clyellow,Mode,pos); 6 : dessin_SupG(PCanvasTCO,X,Y,Clyellow,Mode); 7 : dessin_SupD(PCanvasTCO,X,Y,Clyellow,Mode); 8 : dessin_infD(PCanvasTCO,X,Y,Clyellow,Mode); 9 : dessin_infG(PCanvasTCO,X,Y,Clyellow,mode); 10 : dessin_Diag1(PCanvasTCO,X,Y,Clyellow,mode); 11 : dessin_Diag2(PCanvasTCO,X,Y,Clyellow,mode); - 12 : dessin_feu(PCanvasTCO,X,Y,Clyellow,mode); - - //else entoure_cell(x,y); + 12 : dessin_Aig45PG_AG(PCanvasTCO,X,Y,Clyellow,mode,pos); + 13 : dessin_Aig45PD_AD(PCanvasTCO,X,Y,Clyellow,mode,pos); + 14 : dessin_Aig45PD_AG(PCanvasTCO,X,Y,Clyellow,mode,pos); + 15 : dessin_Aig45PG_AD(PCanvasTCO,X,Y,Clyellow,mode,pos); + 30 : dessin_feu(PCanvasTCO,X,Y,Clyellow,mode); end; + PCanvasTCO.font.Size:=(LargeurCell div 10)+4 ; +// Affiche(intToSTR( (LargeurCell div 30)+6),clyellow); - if (BImage>=2) and (BImage<12) and (i<>0) then - begin // Adresse de l'élément - with PCanvasTCO do - begin - font.Size:=5; - Brush.Color:=fond; - Font.Color:=CouleurAdresse; - TextOut(xOrg+1,yOrg+1,s); - end; - end - else - if (BImage=1) and (i<>0) then - begin // Adresse de l'élément - with PCanvasTCO do - begin - font.Size:=5; - Brush.Color:=fond; - Font.Color:=CouleurAdresse; - TextOut(xOrg+1,yOrg+21,s); - end; - end; - //canvasTCO.TextOut(xOrg+1,yOrg+1,IntToSTR(x)); + // affiche le texte des aiguillages + if (BImage>=2) and (BImage<29) and (adresse<>0) then + begin // Adresse de l'élément + with PCanvasTCO do + begin + Brush.Color:=fond; + Font.Color:=clYellow; + x:=0;y:=0; + if Bimage=4 then begin x:=1;y:=0;end; + if Bimage=5 then begin x:=1;y:=HauteurCell-12;end; + if Bimage=12 then begin x:=1;y:=HauteurCell-12;end; + TextOut(xOrg+x,yOrg+y,s); + exit; + end; + end; + + // détecteurs + if (BImage=1) and (adresse<>0) then + begin // Adresse de l'élément + with PCanvasTCO do + begin + Brush.Color:=fond; + Font.Color:=clWhite; + TextOut(xOrg+1,yOrg+1,s); + exit; + end; + end; + + // texte des signaux + if (BImage=30) and (adresse<>0) then + begin + i:=tco[x,y].IndexFeu; + if i=0 then exit; + aspect:=feuTCO[i].aspect; + oriente:=Feutco[i].FeuOriente; + x:=0;y:=0; + if (aspect=9) and (Oriente=1) then begin x:=LargeurCell-round(18*frXGlob);y:=2*HauteurCell-round(18*fryGlob);end; + if (aspect=9) and (Oriente=2) then begin x:=round(10*frXGlob);y:=HauteurCell-round(17*frYGlob);end; // orientation G + if (aspect=9) and (Oriente=3) then begin x:=LargeurCell+2;y:=1;end; + if (aspect=7) and (Oriente=1) then begin x:=LargeurCell-round(18*frXGlob);y:=HauteurCell+1;end; + if (aspect=7) and (Oriente=2) then begin x:=round(10*frXGlob);y:=HauteurCell-round(15*frYGlob);end; + if (aspect=7) and (Oriente=3) then begin x:=LargeurCell+2;y:=1;end; + if (aspect=5) and (Oriente=1) then begin x:=round(24*frXGlob);y:=1;end; + if (aspect=5) and (Oriente=2) then begin x:=round(10*frXGlob);y:=round(2*frYGlob);end; + if (aspect=5) and (Oriente=3) then begin x:=round(10*frXGlob);y:=HauteurCell-round(22*frYGlob);end; + if (aspect=4) and (Oriente=1) then begin x:=LargeurCell-18;y:=1;end; + if (aspect=4) and (Oriente=2) then begin x:=round(10*frXGlob);y:=round(2*frYGlob);end; + if (aspect=4) and (Oriente=3) then begin x:=round(10*frXGlob);y:=HauteurCell-round(22*frYGlob);end; + if (aspect=3) and (Oriente=1) then begin x:=LargeurCell-18;y:=1;end; + if (aspect=3) and (Oriente=2) then begin x:=round(10*frXGlob);y:=round(2*frYGlob);end; + if (aspect=3) and (Oriente=3) then begin x:=round(10*frXGlob);y:=HauteurCell-round(22*frYGlob);end; + if (aspect=2) and (Oriente=1) then begin x:=LargeurCell-round(18*frXGlob);y:=1;end; // orientation V + if (aspect=2) and (Oriente=2) then begin x:=round(10*frXGlob);y:=round(2*frYGlob);end; // orientation G + if (aspect=2) and (Oriente=3) then begin x:=round(10*frXGlob);y:=HauteurCell-round(22*frYGlob);end; // orientation D + with PCanvasTCO do + begin + Brush.Color:=fond; + Font.Color:=clLime; + TextOut(xOrg+x,yOrg+y,s); + end; + end; + + //canvasTCO.TextOut(xOrg+1,yOrg+1,IntToSTR(x)); end; // affiche le tco suivant le tableau TCO procedure TformTCO.Affiche_TCO ; -var x,y,DimX,DimY : integer; +var x,y,x0,y0,DimX,DimY : integer; s : string; r : Trect; begin @@ -1072,11 +1728,16 @@ begin PScrollBoxTCO.HorzScrollBar.Range:=DimX; PScrollBoxTCO.VertScrollBar.Range:=DimY; + + calcul_reduction(frxGlob,fryGlob,LargeurCell,HauteurCell,ZoomMax,ZoomMax); + + //Affiche(formatfloat('0.000000',frxGlob),clyellow); //effacer tout with PcanvasTCO do begin Brush.Color:=clWhite; + Pen.width:=1; r:=rect(0,0,ImageTCO.Width,ImageTCO.height); FillRect(r); Brush.Style:=bsSolid; @@ -1086,41 +1747,62 @@ begin FillRect(r); end; - //afficher les cellules + //afficher les cellules sauf les feux for y:=1 to NbreCellY do for x:=1 to NbreCellX do begin - affiche_cellule(x,y,PmCopy); + if TCO[x,y].BImage<>30 then affiche_cellule(x,y,PmCopy); + end; + + PCanvasTCO.Font.Size:=8; + //afficher les cellules des feux pour que les pieds recouvrent le reste et afficher les textes + for y:=1 to NbreCellY do + for x:=1 to NbreCellX do + begin + if TCO[x,y].BImage=30 then affiche_cellule(x,y,PmCopy); + s:=Tco[x,y].Texte; + if s<>'' then + begin + x0:=(x-1)*Largeurcell; + y0:=(y-1)*hauteurcell; + PcanvasTCO.Textout(x0+2,y0+1,s); + end; end; // afficher la grille grille; + + if entoure then + begin + Entoure_cell(Xentoure,Yentoure); + end; + end; procedure TFormTCO.FormCreate(Sender: TObject); begin caption:='TCO'; - LargeurCell:=25; - HauteurCell:=25; AvecGrille:=true; + TCO_modifie:=false; XclicCell:=1; YclicCell:=1; + xCoupe:=0;yCoupe:=0; KeyPreview:=false; // invalide les évènements clavier fond:=$202050; couleurAdresse:=Cyan; - xMiniSel:=999;yMiniSel:=999; + xMiniSel:=99999;yMiniSel:=99999; xMaxiSel:=0;yMaxiSel:=0; SelectionAffichee:=false; + ImageTCO.Canvas.font.Name:='Arial'; end; - - // clic gauche sur image procedure TFormTCO.ImageTCOClick(Sender: TObject); var Position: TPoint; + i ,adresse,Bimage : integer; + s : string; begin - //Entoure_cell(XclicCell,YclicCell); GetCursorPos(Position); Position:=ImageTCO.screenToCLient(Position); @@ -1130,7 +1812,33 @@ begin YclicCell:=Yclic div hauteurCell +1; if XclicCell>NbreCellX then exit; if YclicCell>NbreCellY then exit; - + + Bimage:=tco[XClicCell,YClicCell].Bimage; + + if not(SelectionAffichee) then // si la sélection bleue n'est pas affichée + begin + if not(entoure) then // si la cellule n'avait pas été entourée + begin + Entoure_cell(XclicCell,YclicCell); + entoure:=true; + Xentoure:=XClicCell;Yentoure:=YclicCell; + end + else + begin + Entoure_cell(Xentoure,Yentoure); // efface l'ancien + Entoure_cell(XclicCell,YclicCell); + Xentoure:=XClicCell;Yentoure:=YclicCell; + end; + + if (Bimage=1) or (Bimage=0) then + begin + s:=Tco[XClicCell,YClicCell].Texte; + EditTexte.Text:=s; + EditTexte.Visible:=true + end + else EditTexte.Visible:=false; + + end; LabelX.caption:=IntToSTR(XclicCell); LabelY.caption:=IntToSTR(YclicCell); @@ -1140,8 +1848,15 @@ begin EditAdrElement.Text:=IntToSTR(tco[XClicCellInserer,YClicCellInserer].Adresse); EdittypeElement.Text:=IntToSTR(tco[XClicCellInserer,YClicCellInserer].BType); - EdittypeImage.Text:=IntToSTR(tco[XClicCellInserer,YClicCellInserer].BImage); + EdittypeImage.Text:=IntToSTR(BImage); + if Bimage=30 then //feu + begin + Adresse:=tco[XClicCellInserer,YClicCellInserer].Adresse; + i:=Index_Feu(adresse); + end; + + //Affiche('XClicCell='+intToSTR(XclicCell)+' '+'YClicCell='+intToSTR(YclicCell),clyellow); //Affiche('Evt ImageTCOclick',clYellow); end; @@ -1161,6 +1876,7 @@ begin Pen.Mode:=PmXor; r:=Rect(x0,y0,x0+largeurCell,y0+LargeurCell); Rectangle(r); + Pen.width:=1; // FillRect(r); end; @@ -1172,7 +1888,31 @@ begin if not(Forminit) then begin FormInit:=true; + Button1.Visible:=not(Diffusion); + Button2.Visible:=not(Diffusion); + ImageTemp.Visible:=not(Diffusion); + lire_fichier_tco; + + calcul_reduction(frxGlob,fryGlob,LargeurCell,HauteurCell,ZoomMax,ZoomMax); + // dessiner les icônes + dessin_AigPD_AD(ImagePalette5.Canvas,1,1,clyellow,pmCopy,0); + dessin_AigG_PD(ImagePalette2.Canvas,1,1,clyellow,pmCopy,0); + dessin_AigPG_AG(ImagePalette3.Canvas,1,1,clyellow,pmCopy,0); + dessin_AigD_PG(ImagePalette4.Canvas,1,1,clyellow,pmCopy,0); + dessin_voie(ImagePaletteDroit.canvas,1,1,Clyellow,pmCopy); + dessin_SupG(ImageSupG.canvas,1,1,Clyellow,pmCopy); + dessin_SupD(ImageSupD.canvas,1,1,Clyellow,pmCopy); + dessin_InfD(ImageInfD.canvas,1,1,Clyellow,pmCopy); + dessin_infG(ImageInfG.canvas,1,1,Clyellow,pmCopy); + dessin_Diag1(ImageDiag1.Canvas,1,1,Clyellow,pmCopy); + dessin_Diag2(ImageDiag2.Canvas,1,1,Clyellow,pmCopy); + dessin_Aig45PG_AG(ImageAig45PG_AG.Canvas,1,1,Clyellow,pmCopy,0); + dessin_Aig45PD_AD(ImageAig45PD_AD.Canvas,1,1,Clyellow,pmCopy,0); + dessin_Aig45PD_AG(ImageAig45PD_AG.Canvas,1,1,Clyellow,pmCopy,0); + dessin_Aig45PG_AD(ImageAig45PG_AD.Canvas,1,1,Clyellow,pmCopy,0); + + ImageTCO.Width:=LargeurCell*NbreCellX; ImageTCO.Height:=HauteurCell*NbreCellY; @@ -1188,19 +1928,6 @@ begin PImageTemp:=FormTCO.ImageTemp; PImageTemp.Canvas.Rectangle(0,0,PImageTemp.Width,PimageTemp.Height); - // dessiner les icônes - dessin_AigPD_AD(ImagePalette1.Canvas,1,1,clyellow,pmCopy); - dessin_AigG_PD(ImagePalette2.Canvas,1,1,clyellow,pmCopy); - dessin_AigPG_AG(ImagePalette3.Canvas,1,1,clyellow,pmCopy); - dessin_AigD_PG(ImagePalette4.Canvas,1,1,clyellow,pmCopy); - dessin_voie(ImagePaletteDroit.canvas,1,1,Clyellow,pmCopy); - dessin_SupG(ImageSupG.canvas,1,1,Clyellow,pmCopy); - dessin_SupD(ImageSupD.canvas,1,1,Clyellow,pmCopy); - dessin_InfD(ImageInfD.canvas,1,1,Clyellow,pmCopy); - dessin_infG(ImageInfG.canvas,1,1,Clyellow,pmCopy); - dessin_Diag1(ImageDiag1.Canvas,1,1,Clyellow,pmCopy); - dessin_Diag2(ImageDiag2.Canvas,1,1,Clyellow,pmCopy); - With ImageFeu do begin Picture.Bitmap.TransparentMode:=tmAuto; @@ -1210,7 +1937,8 @@ begin end; Affiche_tco; end; - + TrackBarZoom.Position:=ZoomMax-LargeurCell+20; + end; // evt qui se produit quand on clic droit dans l'image @@ -1225,9 +1953,28 @@ begin Xclic:=position.X;YClic:=position.Y; XclicCell:=Xclic div largeurCell +1; YclicCell:=Yclic div hauteurCell +1; + + if not(SelectionAffichee) then + begin + if not(entoure) then + begin + Entoure_cell(XclicCell,YclicCell);entoure:=true; + Xentoure:=XClicCell;Yentoure:=YclicCell; + end + else + begin + Entoure_cell(Xentoure,Yentoure); // efface l'ancien + Entoure_cell(XclicCell,YclicCell); + Xentoure:=XClicCell;Yentoure:=YclicCell; + end; + end; + LabelX.caption:=IntToSTR(XclicCell); LabelY.caption:=IntToSTR(YclicCell); + label1.caption:='clicContext'; + + XclicCellInserer:=XClicCell; YclicCellInserer:=YClicCell; //Entoure_cell(XclicCellInserer,YclicCellInserer); @@ -1235,39 +1982,9 @@ begin //Affiche('XClicCell='+intToSTR(XclicCell)+' '+'YClicCell='+intToSTR(YclicCell),clyellow); end; -// menu droit "clic aiguillage G PG" -procedure TFormTCO.aiguillageG_PGClick(Sender: TObject); -var Position: TPoint; -begin - // effacer le carré pointeur - //Entoure_cell(XclicCell,YclicCell); - // dessine le dessin - dessin_AigPG_AG(ImageTCO.canvas,XClicCellInserer,YClicCellInserer,clyellow,pmCopy); - // remet le carré pointeur - //Entoure_cell(XclicCell,YclicCell); - - EditAdrElement.Text:=IntToSTR(tco[XClicCellInserer,YClicCellInserer].Adresse); - EdittypeElement.Text:=IntToSTR(tco[XClicCellInserer,YClicCellInserer].BType); - -end; - -// menu droit "clic aiguillage D PD" -procedure TFormTCO.aiguillageD_PDClick(Sender: TObject); -var Position: TPoint; -begin - // effacer le carré pointeur - //Entoure_cell(XclicCell,YclicCell); - // dessine le dessin - dessin_AigPD_AD(ImageTCO.Canvas,XClicCellInserer,YClicCellInserer,clyellow,pmCopy); - // remet le carré pointeur - //Entoure_cell(XclicCell,YclicCell); - - EditAdrElement.Text:=IntToSTR(tco[XClicCellInserer,YClicCellInserer].Adresse); - EdittypeElement.Text:=IntToSTR(tco[XClicCellInserer,YClicCellInserer].BType); - -end; +(* procedure TFormTCO.Aiguillagegauchepointedroite1Click(Sender: TObject); var Position: TPoint; begin @@ -1281,24 +1998,24 @@ begin EditAdrElement.Text:=IntToSTR(tco[XClicCellInserer,YClicCellInserer].Adresse); EdittypeElement.Text:=IntToSTR(tco[XClicCellInserer,YClicCellInserer].BType); -end; +end; procedure TFormTCO.Aiguillagedroitpointegauche1Click(Sender: TObject); var Position: TPoint; begin tco[XClicCellInserer,YClicCellInserer].Adresse:=1; - tco[XClicCellInserer,YClicCellInserer].Btype:=1; + tco[XClicCellInserer,YClicCellInserer].Btype:=5; // effacer le carré pointeur //Entoure_cell(XclicCell,YclicCell); // dessine le dessin - dessin_AigD_PG(ImageTCO.canvas,XClicCellInserer,YClicCellInserer,clyellow,pmCopy); + dessin_AigD_PG(ImageTCO.canvas,XClicCellInserer,YClicCellInserer,clyellow,pmCopy,0); // remet le carré pointeur //Entoure_cell(XclicCell,YclicCell); EditAdrElement.Text:=IntToSTR(tco[XClicCellInserer,YClicCellInserer].Adresse); EdittypeElement.Text:=IntToSTR(tco[XClicCellInserer,YClicCellInserer].BType); -end; +end; *) procedure TFormTCO.FormKeyDown(Sender: TObject; var Key: Word;Shift: TShiftState); begin @@ -1397,38 +2114,37 @@ begin accept:=true; end; -procedure TFormTCO.ImagePalette1MouseDown(Sender: TObject; +procedure TFormTCO.ImagePalette5MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin - ImagePalette1.BeginDrag(true); + ImagePalette5.BeginDrag(true); end; -procedure TFormTCO.ImagePalette1EndDrag(Sender, Target: TObject; X, +procedure TFormTCO.ImagePalette5EndDrag(Sender, Target: TObject; X, Y: Integer); begin if (x=0) and (y=0) then exit; + TCO_modifie:=true; Xclic:=X;YClic:=Y; XclicCell:=Xclic div largeurCell +1; YclicCell:=Yclic div hauteurCell +1; - dessin_AigPD_AD(ImageTCO.Canvas,XClicCell,YClicCell,Clyellow,pmCopy); + dessin_AigPD_AD(ImageTCO.Canvas,XClicCell,YClicCell,Clyellow,pmCopy,0); tco[XClicCell,YClicCell].BType:=2; // aiguillage - tco[XClicCell,YClicCell].BImage:=1; // image 1 - + tco[XClicCell,YClicCell].BImage:=5; // image 5 + EditAdrElement.Text:=IntToSTR( tco[XClicCell,YClicCell].Adresse); EdittypeElement.Text:=IntToSTR( tco[XClicCell,YClicCell].Btype); EdittypeImage.Text:=IntToSTR(tco[XClicCell,YClicCell].BImage); end; - - -procedure TFormTCO.ImagePalette2EndDrag(Sender, Target: TObject; X, - Y: Integer); +procedure TFormTCO.ImagePalette2EndDrag(Sender,Target: TObject; X,Y: Integer); begin if (x=0) and (y=0) then exit; + TCO_modifie:=true; Xclic:=X;YClic:=Y; XclicCell:=Xclic div largeurCell +1; YclicCell:=Yclic div hauteurCell +1; - dessin_AigG_PD(ImageTCO.Canvas,XClicCell,YClicCell,Clyellow,pmCopy); + dessin_AigG_PD(ImageTCO.Canvas,XClicCell,YClicCell,Clyellow,pmCopy,0); tco[XClicCell,YClicCell].BType:=2; // aiguillage tco[XClicCell,YClicCell].BImage:=2; // image 2 @@ -1446,10 +2162,11 @@ end; procedure TFormTCO.ImagePalette3EndDrag(Sender, Target: TObject; X,Y: Integer); begin if (x=0) and (y=0) then exit; + TCO_modifie:=true; Xclic:=X;YClic:=Y; XclicCell:=Xclic div largeurCell +1; YclicCell:=Yclic div hauteurCell +1; - dessin_AigPG_AG(ImageTCO.Canvas,XClicCell,YClicCell,Clyellow,pmCopy); + dessin_AigPG_AG(ImageTCO.Canvas,XClicCell,YClicCell,Clyellow,pmCopy,0); tco[XClicCell,YClicCell].BType:=2; // aiguillage tco[XClicCell,YClicCell].BImage:=3; // image 3 @@ -1467,10 +2184,11 @@ end; procedure TFormTCO.ImagePalette4EndDrag(Sender, Target: TObject; X,Y: Integer); begin if (x=0) and (y=0) then exit; + TCO_modifie:=true; Xclic:=X;YClic:=Y; XclicCell:=Xclic div largeurCell +1; YclicCell:=Yclic div hauteurCell +1; - dessin_AigD_PG(ImageTCO.Canvas,XClicCell,YClicCell,Clyellow,pmCopy); + dessin_AigD_PG(ImageTCO.Canvas,XClicCell,YClicCell,Clyellow,pmCopy,0); tco[XClicCell,YClicCell].BType:=2; // aiguillage tco[XClicCell,YClicCell].BImage:=4; // image 4 @@ -1489,12 +2207,13 @@ procedure TFormTCO.ImagePaletteDroitEndDrag(Sender, Target: TObject; X, Y: Integer); begin if (x=0) and (y=0) then exit; + TCO_modifie:=true; Xclic:=X;YClic:=Y; XclicCell:=Xclic div largeurCell +1; YclicCell:=Yclic div hauteurCell +1; dessin_voie(ImageTCO.Canvas,XClicCell,YClicCell,Clyellow,pmCopy); tco[XClicCell,YClicCell].BType:=1; // voie - tco[XClicCell,YClicCell].BImage:=5; // image 5 + tco[XClicCell,YClicCell].BImage:=1; // image 1 tco[XClicCell,YClicCell].Adresse:=0; EditAdrElement.Text:=IntToSTR( tco[XClicCell,YClicCell].Adresse); @@ -1511,6 +2230,7 @@ end; procedure TFormTCO.ImageSupGEndDrag(Sender, Target: TObject; X,Y: Integer); begin if (x=0) and (y=0) then exit; + TCO_modifie:=true; Xclic:=X;YClic:=Y; XclicCell:=Xclic div largeurCell +1; YclicCell:=Yclic div hauteurCell +1; @@ -1533,6 +2253,7 @@ procedure TFormTCO.ImageSupDEndDrag(Sender, Target: TObject; X, Y: Integer); begin if (x=0) and (y=0) then exit; + TCO_modifie:=true; Xclic:=X;YClic:=Y; XclicCell:=Xclic div largeurCell +1; YclicCell:=Yclic div hauteurCell +1; @@ -1556,6 +2277,7 @@ procedure TFormTCO.ImageInfDEndDrag(Sender, Target: TObject; X, Y: Integer); begin if (x=0) and (y=0) then exit; + TCO_modifie:=true; Xclic:=X;YClic:=Y; XclicCell:=Xclic div largeurCell +1; YclicCell:=Yclic div hauteurCell +1; @@ -1581,10 +2303,38 @@ begin ImageInfG.BeginDrag(true); end; + +procedure TFormTCO.ImageAig45PG_AGMouseDown(Sender: TObject; + Button: TMouseButton; Shift: TShiftState; X, Y: Integer); +begin + ImageAig45PG_AG.BeginDrag(true); +end; + + +procedure TFormTCO.ImageAig45PD_ADMouseDown(Sender: TObject; + Button: TMouseButton; Shift: TShiftState; X, Y: Integer); +begin + ImageAig45PD_AD.BeginDrag(true); +end; + + +procedure TFormTCO.ImageAig45PD_AGMouseDown(Sender: TObject; + Button: TMouseButton; Shift: TShiftState; X, Y: Integer); +begin + ImageAig45PD_AG.BeginDrag(true); +end; + +procedure TFormTCO.ImageAig45PG_ADMouseDown(Sender: TObject; + Button: TMouseButton; Shift: TShiftState; X, Y: Integer); +begin + ImageAig45PG_AD.BeginDrag(true); +end; + procedure TFormTCO.ImageInfGEndDrag(Sender, Target: TObject; X, Y: Integer); begin if (x=0) and (y=0) then exit; + TCO_modifie:=true; Xclic:=X;YClic:=Y; XclicCell:=Xclic div largeurCell +1; YclicCell:=Yclic div hauteurCell +1; @@ -1598,12 +2348,103 @@ begin EdittypeImage.Text:=IntToSTR(tco[XClicCell,YClicCell].BImage); end; +procedure TFormTCO.ImageAig45PG_AGEndDrag(Sender, Target: TObject; X, + Y: Integer); +begin + if (x=0) and (y=0) then exit; + TCO_modifie:=true; + Xclic:=X;YClic:=Y; + XclicCell:=Xclic div largeurCell +1; + YclicCell:=Yclic div hauteurCell +1; + dessin_Aig45PG_AG(ImageTCO.Canvas,XClicCell,YClicCell,Clyellow,pmCopy,0); + tco[XClicCell,YClicCell].BType:=0; // rien + tco[XClicCell,YClicCell].BImage:=12; // image 12 + tco[XClicCell,YClicCell].Adresse:=0; // rien + + EditAdrElement.Text:=IntToSTR( tco[XClicCell,YClicCell].Adresse); + EdittypeElement.Text:=IntToSTR( tco[XClicCell,YClicCell].Btype); + EdittypeImage.Text:=IntToSTR(tco[XClicCell,YClicCell].BImage); +end; + + +procedure TFormTCO.ImageAig45PD_ADEndDrag(Sender, Target: TObject; X, + Y: Integer); +begin + if (x=0) and (y=0) then exit; + TCO_modifie:=true; + Xclic:=X;YClic:=Y; + XclicCell:=Xclic div largeurCell +1; + YclicCell:=Yclic div hauteurCell +1; + dessin_Aig45PD_AD(ImageTCO.Canvas,XClicCell,YClicCell,Clyellow,pmCopy,0); + tco[XClicCell,YClicCell].BType:=0; // rien + tco[XClicCell,YClicCell].BImage:=13; // image 13 + tco[XClicCell,YClicCell].Adresse:=0; // rien + + EditAdrElement.Text:=IntToSTR( tco[XClicCell,YClicCell].Adresse); + EdittypeElement.Text:=IntToSTR( tco[XClicCell,YClicCell].Btype); + EdittypeImage.Text:=IntToSTR(tco[XClicCell,YClicCell].BImage); +end; + +procedure TFormTCO.ImageAig45PD_AGEndDrag(Sender, Target: TObject; X, + Y: Integer); +begin + if (x=0) and (y=0) then exit; + TCO_modifie:=true; + Xclic:=X;YClic:=Y; + XclicCell:=Xclic div largeurCell +1; + YclicCell:=Yclic div hauteurCell +1; + dessin_Aig45PD_AG(ImageTCO.Canvas,XClicCell,YClicCell,Clyellow,pmCopy,0); + tco[XClicCell,YClicCell].BType:=0; // rien + tco[XClicCell,YClicCell].BImage:=14; // image 14 + tco[XClicCell,YClicCell].Adresse:=0; // rien + + EditAdrElement.Text:=IntToSTR( tco[XClicCell,YClicCell].Adresse); + EdittypeElement.Text:=IntToSTR( tco[XClicCell,YClicCell].Btype); + EdittypeImage.Text:=IntToSTR(tco[XClicCell,YClicCell].BImage); +end; + + +procedure TFormTCO.ImageAig45PG_ADEndDrag(Sender, Target: TObject; X, + Y: Integer); +begin + if (x=0) and (y=0) then exit; + TCO_modifie:=true; + Xclic:=X;YClic:=Y; + XclicCell:=Xclic div largeurCell +1; + YclicCell:=Yclic div hauteurCell +1; + Dessin_Aig45PG_AD(ImageTCO.Canvas,XClicCell,YClicCell,Clyellow,pmCopy,0); + tco[XClicCell,YClicCell].BType:=0; // rien + tco[XClicCell,YClicCell].BImage:=15; // image 15 + tco[XClicCell,YClicCell].Adresse:=0; // rien + + EditAdrElement.Text:=IntToSTR( tco[XClicCell,YClicCell].Adresse); + EdittypeElement.Text:=IntToSTR( tco[XClicCell,YClicCell].Btype); + EdittypeImage.Text:=IntToSTR(tco[XClicCell,YClicCell].BImage); +end; + procedure TFormTCO.ButtonSauveTCOClick(Sender: TObject); begin sauve_fichier_tco; end; -procedure copier; +procedure TFormTCO.MenuCollerClick(Sender: TObject); +var x,y,xPlace,yPlace : integer; +begin + if TamponAffecte then + begin + for y:=TamponTCO_Org.y1 to TamponTCO_Org.y2 do // rectangle de la sélection + for x:=TamponTCO_Org.x1 to TamponTCO_Org.x2 do + begin + xPlace:=XclicCell+x-TamponTCO_Org.x1; // destination + yPlace:=YclicCell+y-TamponTCO_Org.y1; + if (xPlace<=NbreCellX) and (yPlace<=NbreCellY) then tco[xPlace,yPlace]:=tamponTCO[x,y]; + end; + end; + Affiche_TCO; + TCO_modifie:=true; +end; + +procedure copier; var x,y : integer; begin if SelectionAffichee then @@ -1612,9 +2453,6 @@ begin TamponTCO_Org.x2:=XmaxiSel div LargeurCell +1; TamponTCO_Org.y1:=yminiSel div LargeurCell +1; TamponTCO_Org.y2:=ymaxiSel div LargeurCell +1; - - - for y:=TamponTCO_Org.y1 to TamponTCO_Org.y2 do for x:=TamponTCO_Org.x1 to TamponTCO_Org.x2 do tamponTCO[x,y]:=tco[x,y]; @@ -1623,6 +2461,11 @@ begin end; +procedure TFormTCO.MenuCopierClick(Sender: TObject); +begin + copier; +end; + // supprimer la sélection procedure TFormTCO.MenuCouperClick(Sender: TObject); var Position: TPoint; @@ -1631,15 +2474,16 @@ var Position: TPoint; begin if not(SelectionAffichee) then exit; + TCO_modifie:=true; copier; - SelectionAffichee:=false; xCell1:=XminiSel div LargeurCell +1; xCell2:=XmaxiSel div LargeurCell +1; yCell1:=yminiSel div HauteurCell +1; yCell2:=ymaxiSel div HauteurCell +1; - + + xCoupe:=XCell1;yCoupe:=yCell1; for y:=yCell1 to yCell2 do for x:=xCell1 to xCell2 do begin @@ -1647,18 +2491,40 @@ begin tco[x,y].Adresse:=0; tco[x,y].BImage:=0; //Affiche('Efface cellules '+IntToSTR(X)+' '+intToSTR(y),clyellow); - efface_cellule(ImageTCO.Canvas,X,Y,Clyellow,PmCopy); - + efface_cellule(ImageTCO.Canvas,X,Y,fond,PmCopy); + if avecGrille then grille; end; - end; +procedure TFormTCO.AnnulercouperClick(Sender: TObject); +var x,y,Xplace,yplace : integer; +begin + if TamponAffecte then + begin + if (xCoupe<>0) and (ycoupe<>0) then + begin + for y:=TamponTCO_Org.y1 to TamponTCO_Org.y2 do // rectangle de la sélection + for x:=TamponTCO_Org.x1 to TamponTCO_Org.x2 do + begin + xPlace:=xCoupe+x-TamponTCO_Org.x1; // destination + yPlace:=yCoupe+y-TamponTCO_Org.y1; + if (xPlace<=NbreCellX) and (yPlace<=NbreCellY) then tco[xPlace,yPlace]:=tamponTCO[x,y]; + end; + end; + end; + Affiche_TCO; +end; + + +// évènement qui se produit quand on clique gauche ou droit procedure TFormTCO.ImageTCOMouseDown(Sender: TObject; Button: TMouseButton;Shift: TShiftState; X, Y: Integer); var position : Tpoint; + begin +// ImageTCO.BeginDrag(true); if button=mbLeft then begin - xMiniSel:=999;yMiniSel:=999; + xMiniSel:=99999;yMiniSel:=99999; xMaxiSel:=0;yMaxiSel:=0; sourisclic:=true; if SelectionAffichee then @@ -1674,6 +2540,7 @@ begin SelectionAffichee:=false; end; end; + if button=mbRight then begin GetCursorPos(Position); @@ -1693,9 +2560,7 @@ begin EditAdrElement.Text:=IntToSTR(tco[XClicCellInserer,YClicCellInserer].Adresse); EdittypeElement.Text:=IntToSTR(tco[XClicCellInserer,YClicCellInserer].BType); - EdittypeImage.Text:=IntToSTR(tco[XClicCellInserer,YClicCellInserer].BImage); - - end; + end; end; procedure TFormTCO.ImageTCOMouseMove(Sender: TObject; Shift: TShiftState;X, Y: Integer); @@ -1709,6 +2574,8 @@ begin SourisY.Caption:=IntToSTR(y); if not(sourisclic) then exit; + + // on a cliqué la souris en la bougeant : sélection bleue en cours //Affiche('MouseMove',clyellow); GetCursorPos(Position); Position:=ImageTCO.screenToCLient(Position); @@ -1768,6 +2635,8 @@ begin Rectangle(r); end; SelectionAffichee:=true; + if entoure then Entoure_cell(Xentoure,Yentoure); // efface + entoure:=false; end; procedure TFormTCO.ImageTCOMouseUp(Sender: TObject; Button: TMouseButton; @@ -1780,27 +2649,7 @@ end; -procedure TFormTCO.MenuCopierClick(Sender: TObject); -begin - copier; -end; -procedure TFormTCO.MenuCollerClick(Sender: TObject); -var x,y,xPlace,yPlace : integer; -begin - if TamponAffecte then - begin - for y:=TamponTCO_Org.y1 to TamponTCO_Org.y2 do // rectangle de la sélection - for x:=TamponTCO_Org.x1 to TamponTCO_Org.x2 do - begin - xPlace:=XclicCell+x-TamponTCO_Org.x1; // destination - yPlace:=YclicCell+y-TamponTCO_Org.y1; - if (xPlace<=NbreCellX) and (yPlace<=NbreCellY) then tco[xPlace,yPlace]:=tamponTCO[x,y]; - end; - end; - Affiche_TCO; - -end; procedure TFormTCO.ButtonRedessineClick(Sender: TObject); begin @@ -1809,7 +2658,7 @@ end; // changement de l'adresse d'un élément procedure TFormTCO.EditAdrElementChange(Sender: TObject); -var Adr,erreur,i : integer; +var Adr,erreur,i,index : integer; begin Val(EditAdrElement.Text,Adr,erreur); if (erreur<>0) or (Adr<0) or (Adr>2048) then @@ -1819,18 +2668,29 @@ begin end; tco[XClicCell,YClicCell].Adresse:=Adr; - affiche_cellule(XClicCell,YClicCell,pmCopy); + TCO_modifie:=true; + // Efface_cellule(PCanvasTCO,XClicCell,YClicCell+1,Fond,pmcopy); + // si c'est un feu, mettre à jour le tableau FeuTCO - if tco[XClicCell,YClicCell].BImage=12 then + if tco[XClicCell,YClicCell].BImage=30 then begin - - i:=0; - while i0) or (Bimage<0) or (Bimage>11) then + if (erreur<>0) or (Bimage<0) or (Bimage>15) then begin EditTypeImage.text:=intToSTR(tco[XClicCell,YClicCell].BImage); exit; end; + TCO_modifie:=true; tco[XClicCell,YClicCell].Bimage:=Bimage; case Bimage of // aiguillages - 1,2,3,4 : tco[XClicCell,YClicCell].Btype:=2; + 1,2,3,4,13,14,15 : tco[XClicCell,YClicCell].Btype:=2; // détecteur ou voie 5 : tco[XClicCell,YClicCell].Btype:=1; else tco[XClicCell,YClicCell].Btype:=0; @@ -1861,7 +2722,7 @@ begin end; end; -procedure TFormTCO.Maj_TCO(Adresse : integer;etat : boolean); +procedure TFormTCO.Maj_TCO(Adresse : integer); var x,y : integer; begin for y:=1 to NbreCellY do @@ -1874,19 +2735,25 @@ end; procedure TFormTCO.Button1Click(Sender: TObject); begin - Affiche(IntToSTR(NbfeuTCO),clyellow); + Detecteur[569]:=true; + Maj_tco(569); end; + procedure TFormTCO.Button2Click(Sender: TObject); begin - Detecteur[513]:=false; - Maj_tco(513,false); + Detecteur[569]:=false; + Maj_tco(569); end; + // dépose d'un feu sur le TCO procedure TFormTCO.ImageDiag1EndDrag(Sender, Target: TObject; X, Y: Integer); +var i : integer; begin if (x=0) and (y=0) then exit; + TCO_modifie:=true; + inc(NbFeuTCO); Xclic:=X;YClic:=Y; XclicCell:=Xclic div largeurCell +1; YclicCell:=Yclic div hauteurCell +1; @@ -1894,14 +2761,13 @@ begin tco[XClicCell,YClicCell].BType:=0; // rien tco[XClicCell,YClicCell].BImage:=10; // image 10 tco[XClicCell,YClicCell].Adresse:=0; - tco[XClicCell,YClicCell].FeuOriente:=1; - - inc(NbFeuTCO); - FeuTCO[NbFeuTCO].Adresse:=0; - FeuTCO[NbFeuTCO].FeuOriente:=1; - FeuTCO[NbFeuTCO].x:=XClicCell; - FeuTCO[NbFeuTCO].y:=YClicCell; - + tco[XClicCell,YClicCell].IndexFeu:=NbFeuTCO; + Feutco[NbFeuTCO].FeuOriente:=1; + + FeuTCO[NbFeuTCO].Adresse:=0; + FeuTCO[NbFeuTCO].x:=XClicCell; + FeuTCO[NbFeuTCO].y:=YClicCell; + EditAdrElement.Text:=IntToSTR( tco[XClicCell,YClicCell].Adresse); EdittypeElement.Text:=IntToSTR( tco[XClicCell,YClicCell].Btype); EdittypeImage.Text:=IntToSTR(tco[XClicCell,YClicCell].BImage); @@ -1917,6 +2783,7 @@ procedure TFormTCO.ImageDiag2EndDrag(Sender, Target: TObject; X, Y: Integer); begin if (x=0) and (y=0) then exit; + TCO_modifie:=true; Xclic:=X;YClic:=Y; XclicCell:=Xclic div largeurCell +1; YclicCell:=Yclic div hauteurCell +1; @@ -1945,29 +2812,29 @@ end; procedure TFormTCO.ImageFeuEndDrag(Sender, Target: TObject; X, Y: Integer); var r : Trect; + i : integer; begin if (x=0) and (y=0) then exit; + TCO_modifie:=true; Xclic:=X;YClic:=Y; XclicCell:=Xclic div largeurCell +1; YclicCell:=Yclic div hauteurCell +1; //PCanvasTCO.Draw((xClicCell-1)*LargeurCell,(yClicCell-1)*HauteurCell,ImageFeu.Picture.Bitmap); tco[XClicCell,YClicCell].BType:=0; // rien - tco[XClicCell,YClicCell].BImage:=12; + tco[XClicCell,YClicCell].BImage:=30; tco[XClicCell,YClicCell].Adresse:=0; - tco[XClicCell,YClicCell].FeuOriente:=1; - - Affiche(IntToSTR(XclicCell),clyellow); - Affiche(IntToSTR(YclicCell),clyellow); - - TransparentBlt(PcanvasTCO.Handle,(xClicCell-1)*LargeurCell,(yClicCell-1)*HauteurCell,LargeurCell,HauteurCell*2,Formprinc.Image9feux.Canvas.Handle,0,0, - Formprinc.Image9feux.Picture.Bitmap.Width,Formprinc.Image9feux.Picture.Bitmap.Height,clBlue); - PImageTCO.Picture.Bitmap.Modified:=True; // rafraichit l'affichage sinon le stretchblt n'apparaît pas. + inc(NbFeuTCO); + tco[XClicCell,YClicCell].indexFeu:=NbFeuTCO; + FeuTco[NbFeuTCO].FeuOriente:=1; + FeuTco[NbFeuTCO].Aspect:=9; EditAdrElement.Text:=IntToSTR( tco[XClicCell,YClicCell].Adresse); EdittypeElement.Text:=IntToSTR( tco[XClicCell,YClicCell].Btype); EdittypeImage.Text:=IntToSTR(tco[XClicCell,YClicCell].BImage); -end; + dessin_feu(PCanvasTCO,XclicCell,YClicCell,Clyellow,pmCopy); + +end; procedure TFormTCO.ImageFeuMouseDown(Sender: TObject; Button: TMouseButton; @@ -1978,39 +2845,153 @@ end; procedure TFormTCO.Tourner90GClick(Sender: TObject); -var BImage,aspect,adresse : integer; +var BImage,aspect,adresse,index : integer; ImageFeu : TImage; + frX,frY : real; begin BImage:=TCO[XClicCell,YClicCell].Bimage; - if Bimage<>12 then exit; + if Bimage<>30 then exit; + + TCO_modifie:=true; adresse:=TCO[XClicCell,YClicCell].Adresse; - ImageFeu:=PointeurImage(adresse); + index:=TCO[XClicCell,YClicCell].indexFeu; + + // effacement de l'ancien feu + if FeuTCO[index].FeuOriente=3 then + begin + Efface_Cellule(PCanvasTCO,xClicCell,yClicCell,fond,PmCopy); + Efface_Cellule(PCanvasTCO,xClicCell+1,yClicCell,fond,PmCopy); + end; + + if FeuTCO[index].FeuOriente=2 then + begin + Efface_Cellule(PCanvasTCO,xClicCell,yClicCell,fond,PmCopy); + Efface_Cellule(PCanvasTCO,xClicCell-1,yClicCell,fond,PmCopy); + end; - TCO[XClicCell,YClicCell].FeuOriente:=2; // feu orienté à 90° gauche - // effacer le feu - Efface_Cellule(PCanvasTCO,xClicCell,yClicCell,clred,PmCopy); + // si l'image était verticale, il faut effacer la cellule en bas + if FeuTCO[index].FeuOriente=1 then + begin + Efface_Cellule(PCanvasTCO,xClicCell,yClicCell,fond,PmCopy); + Efface_Cellule(PCanvasTCO,xClicCell,yClicCell+1,fond,PmCopy); + end; - Feu_90G(ImageFeu,XClicCell,YclicCell); - Efface_cellule(PCanvasTCO,xClicCell,yClicCell+1,clred,PmCopy); // efface la partie basse du feu vertical + FeuTCO[index].FeuOriente:=2; // feu orienté à 90° gauche + + dessin_feu(PCanvasTCO,XclicCell,YClicCell,Clyellow,pmCopy); end; procedure TFormTCO.Tourner90DClick(Sender: TObject); -var BImage ,aspect,adresse : integer; +var BImage ,aspect,adresse,index : integer; ImageFeu : TImage; + frX,frY : real; begin BImage:=TCO[XClicCell,YClicCell].Bimage; - if Bimage<>12 then exit; - adresse:=TCO[XClicCell,YClicCell].Adresse; - ImageFeu:=PointeurImage(adresse); - - TCO[XClicCell,YClicCell].FeuOriente:=3; // feu orienté à 90° droit - // effacer le feu - Efface_Cellule(PCanvasTCO,xClicCell,yClicCell,clred,PmCopy); - - Feu_90D(ImageFeu,XClicCell,YclicCell); - Efface_cellule(PcanvasTCO,xClicCell,yClicCell+1,clred,PmCopy); // efface la partie basse du feu vertical + if Bimage<>30 then exit; + TCO_modifie:=true; + adresse:=TCO[XClicCell,YClicCell].Adresse; + index:=TCO[XClicCell,YClicCell].indexFeu; + aspect:=FeuTCO[index].aspect; + if aspect=0 then aspect:=9; + + // ancien feu orienté orienté 90D + if FeuTCO[index].FeuOriente=3 then + begin + Efface_Cellule(PCanvasTCO,xClicCell,yClicCell,fond,PmCopy); + if aspect>=4 then Efface_Cellule(PCanvasTCO,xClicCell+1,yClicCell,fond,PmCopy); + end; + + // ancien feu orienté orienté 90G + if FeuTCO[index].FeuOriente=2 then + begin + Efface_Cellule(PCanvasTCO,xClicCell,yClicCell,fond,PmCopy); + if aspect>=4 then Efface_Cellule(PCanvasTCO,xClicCell+1,yClicCell,fond,PmCopy); + end; + + // si l'image était verticale, il faut effacer la cellule en bas + if FeuTCO[index].FeuOriente=1 then + begin + Efface_Cellule(PCanvasTCO,xClicCell,yClicCell,fond,PmCopy); + Efface_Cellule(PCanvasTCO,xClicCell,yClicCell+1,fond,PmCopy); + end; + + FeuTCO[index].FeuOriente:=3; // feu orienté à 90° droit + dessin_feu(PCanvasTCO,XclicCell,YClicCell,Clyellow,pmCopy); end; +procedure TFormTCO.Pos_vertClick(Sender: TObject); +var BImage ,aspect,index,Adresse : integer; + ImageFeu : TImage; +begin + BImage:=TCO[XClicCell,YClicCell].Bimage; + // si c'est autre chose qu'un feu, sortir + if Bimage<>30 then exit; + + TCO_modifie:=true; + adresse:=TCO[XClicCell,YClicCell].Adresse; + index:=TCO[XClicCell,YClicCell].indexFeu; + aspect:=feuTCO[index].aspect; + if aspect=0 then aspect:=9; + + // effacement de l'ancien feu + + // ancien feu orienté orienté 90D + if FeuTCO[index].FeuOriente=3 then + begin + Efface_Cellule(PCanvasTCO,xClicCell,yClicCell,fond,PmCopy); + // si le feu occupe 2 cellules + if aspect>=4 then Efface_Cellule(PCanvasTCO,xClicCell+1,yClicCell,fond,PmCopy); + end; + + // ancien feu orienté orienté 90G + if FeuTCO[index].FeuOriente=2 then + begin + Efface_Cellule(PCanvasTCO,xClicCell,yClicCell,fond,PmCopy); + // si le feu occupe 2 cellules + if aspect>=4 then Efface_Cellule(PCanvasTCO,xClicCell+1,yClicCell,fond,PmCopy); + end; + + // si l'image était verticale, il faut effacer la cellule en bas + if FeuTCO[index].FeuOriente=1 then + begin + Efface_Cellule(PCanvasTCO,xClicCell,yClicCell,fond,PmCopy); + Efface_Cellule(PCanvasTCO,xClicCell,yClicCell+1,fond,PmCopy); + end; + + FeuTCO[index].FeuOriente:=1; // feu orienté à 180° + dessin_feu(PCanvasTCO,XclicCell,YClicCell,Clyellow,pmCopy); + +end; + +procedure TFormTCO.TrackBarZoomChange(Sender: TObject); +begin + LargeurCell:=ZoomMax-TrackBarZoom.Position+20; + hauteurCell:=LargeurCell; + Affiche_TCO; + SelectionAffichee:=false; +end; + + +// interdire la fermeture de la fenêtre tco +procedure TFormTCO.FormClose(Sender: TObject; var Action: TCloseAction); +begin + action:=tCloseAction(caNone); +end; + +procedure TFormTCO.EditTexteChange(Sender: TObject); +var x0,y0 : integer; +begin + x0:=(XClicCell-1)*LargeurCell; + y0:=(YClicCell-1)*HauteurCell; + + PCanvasTCO.TextOut(x0+2,y0+2,EditTexte.Text); + Tco[XClicCell,YClicCell].Texte:=EditTexte.Text; + TCO_modifie:=true; +end; + +begin + + end. diff --git a/config.cfg b/config.cfg index 9149741..ecbaa5e 100644 --- a/config.cfg +++ b/config.cfg @@ -1,129 +1,128 @@ /****************************************** -/ fichier de configuration de signaux_complexes -/ gily - f1iwq - 2018 -/****************************************** +/ fichier de configuration de signaux complexes +/ cap de bouheyre avec signaux - 2018 +/**************************************** / Sans Log=0 / Avec Log=1 : génère un fichier log Log=0 / Affichage du débug du calcul des routes, et enregistrement dans le log si la variable précédente est à 1 TraceDet=0 -/ Envoie un 0 après le pilotage des décodeurs -/ Mettre 1 si utilisation de décodeurs LEB -RazSignaux=1 +/ si 1 envoie un 0 après le pilotage des décodeurs LEB +RazSignaux=0 / / modélisation des aiguillages : détermine les éléments connectés aux 3 branches des aiguilles (Pointe, Droit, Dévié (S) -/ adresse d'aiguillage,P=élément vers pointe D=élément vers Droit, S=élément vers dévié. -/ [60 ou 30 dans le cas d'un aiguillage en position déviée qui doit être fanchie à 30 ou 60] -/ Elément = détecteur (valeur uniquement numérique) ou aiguillage (adresse+branche de connexion (P S ou D) -/ Exemple : 1,P518,D523,S3P signifie : définition de l'aiguillage @1 : sur pointe relié au détecteur 518 +/ adresse d'aiguillage[B],P=élément vers pointe D=élément vers Droit, S=élément vers dévié +/ B pour adresse d'aiguillage déja utilisée +/ Elément = détecteur (valeur uniquement numérique) ou aiguillage (adresse [TRI,TJS,TJD]+branche de connexion (P S ou D) +/ Exemples : 1,P518,D523,S3P signifie : définition de l'aiguillage @1 : sur pointe relié au détecteur 518 / sur Droit relié au détecteur 518 / sur Dévié, relié à l'aiguillage 3 en pointe -/ Pour une TJD : 26TJD,D530,S529,P28 -/ P désigne l'autre adresse de la TJD -/ Aiguillage triple -/ +/ Voir la documentation des signaux complexes pour une description complete / S'il n'y a pas de détecteur connecté à une branche d'aiguillage, mettre 0. -1,P518,S3P,D523,30 -2,P12S,S5S,D519 -3,P1S,S5D,D4P -4,P3D,S514,D6S -5,P515,S2S,D3S -6,P516,S4D,D0 -7,P527,S520,D519 -8,P527,S522,D521 -9,P526,S515,D513,60 -10,P19P,S528,D29P,30 -11,P18P,D30D,S525 -12,P517,D20S,S2P -17,P525,D535,S528 -18,P11P,S517,D23P -19,P10P,S531,D22P -20,P520,D21P,S12D -21,P20D,S28D,D28D -22,P19D,S538,D537 -23,P18D,S534,D538 -24,P538,S533,D32S -25,P31S,D529,S27P -26TJD,D530,S529,P28 -28TJD,D21D,S21S,P26 -27,P25S,D530,S537 -29,P10D,S30S,D513,60 -30,P524,S29D,D11D -31,P534,S25P,D0 -32,P22S,S24D,D0 +1,S1BS,P2P,D3P,0 +1B,P553,D16P,S1S +2,P1P,D4P,S2BS +2B,P521,D16D,S2S +3,P1D,D522,S5BP +4,P2D,D554,S6BP +5,P9P,S15P,D5BS +5B,P3S,S5D,D545,0,1 +6,P10P,S546,D6BS +6B,P4S,D545,S6D +7,P15S,D566,S565 +8,P20P,D566,S565 +9,P5P,D530,S17P +10,P6P,D530,S18P +13,P17S,D563,S564 +14,P18S,D563,S564 +15,P5S,D546,S7P +16,P1BD,S16BS,D2BD +16B,P0,S16S,D557 +17,P9S,D531,S13P +18,P10S,D562,S14P +20,P8P,D547,S548 +21,P25P,S537,D23S +22,P24P,S561,D25S +23,P569,S21D,D538 +24,P22P,S26P,D513 +25,P21P,S22D,D570 +26,P24S,S515,D514 +28,P30P,S29P,D570 +29,P28S,D516,S31P +30,P28P,D32S,S539 +31TRI,27,P29S,D518,S0,S2-517 +32,P571,D538,S30D 0 // / modélisation du réseau par branche -/ 1 ligne par branche - le sens de parcours de la branche est arbitraire. -/ Chaque ligne (branche) doit commmencer et finir par un aiguillage -/ Une ligne qui finit par un 0 signifie un heurtoir +/ 1 ligne par branche - le sens de parcours de la description n'a pas d'importance. +/ Chaque ligne (branche) doit comporter au moins un détecteur et au moins aiguillage / @ détecteur A=@aiguillage -/ Terminer par 0 -/ Exemple : 519 est un détecteur - A2 est l'aiguillage 2 +/ chaque ligne doit commencer par un aiguillage et se terminer par un aiguillage +/ Terminer par les brances par 0 +/ Exemple : 519 est un détecteur - A2 est l'aiguillage 2 - A1B est l'aiguillage 1bis / -A2,A12,517,A18,A11,A30,524,521,A8,527,A7,519,A2 -A7,520,A20,A12 -A1,A3,A4,514,522,A8 -A1,523,526,A9,513,A29,A10,A19,531,518,A1 -A9,515,A5 -A11,525,A17,528,A10 -A17,535,533,A24,538,A23 -A7,520,A20,A21,A28,A26,530,A27,A25,A31,534,A23,A18 -A26,529,A25 -A22,537,A27 -A22,A32,A24 -A6,516,0 -A31,0 +/ rouge - jaune +A20,547,561,A22,A24,A26,515,518,A31,A29,A28,A30,539,522,A3,A1,A2,A4,A6B,545,A5B,A3 +A26,514,517,A31 +A26,515,518,A31 +A24,513,516,A29 +/grande boucle extérieure départ de couche rouge: de 569 à 569 +A23,538,A32,571,553,A1B,A16,A2B,521,569,A23 +/ grande boucle intérieure +A21,A25,570,A28 +A4,554,537,A21 +/ couche jaune +A10,530,A9,A5,A15,546,A6 +A18,562,531,A17 +A14,563,A13 +A14,564,A13 +/ +A7,565,A8 +A7,566,A8 +A16B,557,0 +A20S,548,0 0 -/ liste des adresses des signaux et leur forme, pour affichage de l'image correspondante , -/ avec ou sans bouton de commande pour le feu blanc, type de décodeur [, type de cible (pour les décodeurs Unisemaf uniquement)] +/ +/ liste des signaux / la liste doit être terminée par une adresse à 0 -/ forme : 2=2 feux(carré violet/blanc) / 3=3 feux / 4=4 feux / 5=5 feux (carré + blanc ou violet) -/ 7=7 feux (blanc ou violet + ralentissement / 9=9 feux (blanc ou violet + rappel ralentissement) -/ Dx : signal directionnel à x feux -/ type de décodeur : 1=digital Bahn 2=CDF 3=LDT 4=LEB 5=NMRA 6=Unisemaf +/ forme : 2=2 feux(carré violet/blanc) / 3=3 feux / 4=4 feux (carré) / 5=5 feux (carré + blanc) +/ 7=7 feux (carré+blanc + ralentissement / 9=9 feux (blanc ou violet + rappel ralentissement) +/ type de décodeur : 0=feu virtuel 1=digital Bahn 2=CDF 3=LDT 4=LEB +/ l'énumération des détecteurs ne nécessite pas de parenthèses si il est seul, mais il faut des parenthèses si +/ le signal concerne plusieurs voies (donc détecteurs) / Notation de chaque ligne: -/ adresse de base du signal, forme, avec ou sans bouton de commande du feu blanc, type de décodeur [, détecteur (det2, det3, ...) , élément suivant , -/ avec ou sans demande de verrouillage du feu au carré] -/ -176,7,0,1,(520,A20),1 -190,7,0,1,(523,526),1 -204,9,0,1,(527,A7),1 -218,7,0,1,(525,A17),1 -232,2,1,1,(516,A6),1 -260,9,1,1,(518,A1),1 -274,3,0,1,(524,521),1 -288,7,0,1,(522,A8),1 -302,9,0,1,(526,A9),1 -316,7,1,1,(515,A5),1 -330,7,0,1,(519,A2),1 -344,9,0,1,(528,A10),1 -358,9,0,1,(517,A18),1 -372,D3,1,(A10D)(A19S)(A19D,A22D)(A19D,A22S) -382,D3,1,(A29S,A10S)(A19S)(A19D,A22D)(A19D,A22S) -392,3,0,1,(535,533),1 -420,7,0,1,(529,A25,530,A27,537,A27),1 -448,7,0,1,(533,A24),1 -462,9,0,1,(513,A29),1 -476,9,0,1,(538,A23),1 -497,9,0,4,(531,A19),1 -600,7,0,0,(521,A8),1 +/ adresse de base du signal, forme, réserve, type de décodeur [, (détecteur,..detecteur , élément suivant ..) , +/ avec ou sans demande de verrouillage du feu au carré (0 ou 1)] +161,4,0,4,(538,A32),0 +169,9,0,4,(539,A30),0, +177,9,0,4,(569,A23),0 +185,4,0,4,(570,A25),0 +193,4,0,4,(516,A29),0 +201,2,0,4,(517,31TRI,518,31TRI),0 +209,9,0,4,(513,A24),0 +217,2,0,4,(514,A26,515,A26),0 +225,9,0,4,(561,A22),0 +233,4,0,4,(547,A20),0 +241,4,0,4,(548,A20),1 +1001,3,0,0,(537,554),0 +1003,3,0,0,(553,A1B),0 +1005,3,0,0,(571,553),0 +1007,3,0,0,(554,A4),0 +1009,3,0,0,(522,539),0 +1011,3,0,0,(521,569),0 +1013,3,0,0,(565,A7),0 +1015,3,0,0,(562,A18),0 +1017,3,0,0,(563,A14),0 +1019,3,0,0,(564,A14),0 0 / -/ Section actionneurs. Ne fonctionne qu'en mode connecté à CDM en run / Fonctions Fx à envoyer aux locomotives sur passage d'un actionneur -/ actionneur,état,Nom du train,fonction,temporisation en ms avant remise à 0 -/ -/ Passages à niveau (PN) -/ (act_ferme_voie1,act_ouvre_voie1),(act_ferme_voie2,act_ouvre_voie2),...,PN(adresse_ferme,adresse_ouvre) -/ -/ Klaxon (F2) -/ 815,1,CC406526,F2,400 -/ -/ passage à niveau à 2 voies +/ Uniquement en mode connecté à CDM +/ actionneur,état,Nom de la loco,fonction,temporisation en ms avant remise à 0 +/815,1,CC406526,F2,400 /(815,830),(820,840),PN(121+,121-) -/ -/ passage à niveau à 1 voie /(815,809),PN(121+,121-) 0 + diff --git a/configgily.cfg b/configgily.cfg index a2ee5a3..77b490a 100644 --- a/configgily.cfg +++ b/configgily.cfg @@ -107,9 +107,26 @@ A31,0 476,9,0,1,(538,A23),1 497,9,0,4,(531,A19),1 600,7,0,0,(521,A8),1 -610,9,0,6,(520,A20),0,7 +/ signaux de test +610,4,0,0,(521,a8),1 +615,5,0,0,(521,a8),1 0 / - +/ Section actionneurs. Ne fonctionne qu'en mode connecté à CDM en run +/ Fonctions Fx à envoyer aux locomotives sur passage d'un actionneur +/ actionneur,état,Nom du train,fonction,temporisation en ms avant remise à 0 +/ +/ Passages à niveau (PN) +/ (act_ferme_voie1,act_ouvre_voie1),(act_ferme_voie2,act_ouvre_voie2),...,PN(adresse_ferme,adresse_ouvre) +/ +/ Klaxon (F2) +/ 815,1,CC406526,F2,400 +/ +/ passage à niveau à 2 voies +/(815,830),(820,840),PN(121+,121-) +/ +/ passage à niveau à 1 voie +/(815,809),PN(121+,121-) +0 diff --git a/verif_version.dcu b/verif_version.dcu index 219fd7af143ae6081e100ce898726c842608b837..e6d70cda264c6f9e7d0cd7e424e1f91efa7f1638 100644 GIT binary patch delta 2531 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 z