From 0e52a60c2a8b0cac3a27b577dbf78698037c4a4c Mon Sep 17 00:00:00 2001 From: f1iwq2 Date: Mon, 9 Mar 2020 18:24:14 +0100 Subject: [PATCH] V1.31 --- Signaux_complexes_GL.dof | 2 +- UnitConfig.dcu | Bin 11687 -> 11689 bytes UnitDebug.dcu | Bin 11265 -> 12064 bytes UnitDebug.dfm | 36 +- UnitDebug.pas | 42 +- UnitPrinc.dcu | Bin 160772 -> 162490 bytes UnitPrinc.dfm | 59 +- UnitPrinc.pas | 500 ++++++++----- UnitSimule.dcu | Bin 6907 -> 7382 bytes UnitSimule.dfm | 8 - UnitSimule.pas | 54 +- UnitTCO.dcu | Bin 14807 -> 52601 bytes UnitTCO.dfm | 435 +++++++++++- UnitTCO.pas | 1442 ++++++++++++++++++++++++++++++++++---- configcapde.cfg | 112 --- tco.cfg | 12 + verif_version.dcu | Bin 9088 -> 9088 bytes verif_version.pas | 5 +- versions.txt | 13 + 19 files changed, 2176 insertions(+), 544 deletions(-) delete mode 100644 configcapde.cfg create mode 100644 tco.cfg create mode 100644 versions.txt diff --git a/Signaux_complexes_GL.dof b/Signaux_complexes_GL.dof index f8b9493..490e277 100644 --- a/Signaux_complexes_GL.dof +++ b/Signaux_complexes_GL.dof @@ -95,7 +95,7 @@ UnitOutputDir= PackageDLLOutputDir= PackageDCPOutputDir= SearchPath= -Packages= +Packages=vcl;rtl;vclx;VclSmp;vclshlctrls Conditionals= DebugSourceDirs= UsePackages=0 diff --git a/UnitConfig.dcu b/UnitConfig.dcu index 3aecf08a46520c6a5d460b95f54a9676a76dd5b1..28df7a770a33d8f0f6609c615dbb894578dfdea8 100644 GIT binary patch delta 48 zcmZ1;y)v5nJ_7^)N?is9v6{?{+?>2DiD%U&O_tydW(iK`owPZhS52OonSpilG#x=k E09$$t`v3p{ delta 46 zcmZ1(y*!%xJ_7^)a$N?7lIp~b+?>2DUn<(uCQI-Jvpf^ZOWT~!t0vEwuz7}#AR_={ C{|<}* diff --git a/UnitDebug.dcu b/UnitDebug.dcu index 6df5e9102d520f88b50db89e94470e4d9074ad6b..98a2f5bcd73c6d26b5361552525e855d5478abe3 100644 GIT binary patch delta 4890 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 then + begin + s:=IntToSTR(i)+' Tick='+IntToSTR(event_det_tick[i].tick)+' Det='+IntToSTR(j)+'='+intToSTR(etat); + AfficheDebug(s,clyellow); + end; + end; + + etat:=event_det_tick[i].aiguillage; + if etat<>-1 then + begin + s:=IntToSTR(i)+' Tick='+IntToSTR(event_det_tick[i].tick)+' Aig='+IntToSTR(etat)+'='+intToSTR(event_det_tick[i].position); + AfficheDebug(s,clyellow); end; - if trouve then AfficheDebug(s,clyellow); end; end; @@ -236,4 +250,16 @@ end; +procedure TFormDebug.copier1Click(Sender: TObject); +begin + RichEdit.SelectAll; + RichEdit.CopyToClipboard; + RichEdit.SetFocus; +end; + +procedure TFormDebug.ButtonRazLogClick(Sender: TObject); +begin + MemoDebug.Clear; +end; + end. diff --git a/UnitPrinc.dcu b/UnitPrinc.dcu index 656b01187c1268436546429c844b70a97cf2bfdd..a04593e49b7514340884d7175a719ebbcebcd97b 100644 GIT binary patch delta 54262 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 kk`#6Dgf(NS&by*dCgXmY(%<>K80 diff --git a/UnitPrinc.dfm b/UnitPrinc.dfm index 8fdb643..507a294 100644 --- a/UnitPrinc.dfm +++ b/UnitPrinc.dfm @@ -1,6 +1,6 @@ object FormPrinc: TFormPrinc - Left = 47 - Top = 193 + Left = 64 + Top = 170 AutoSize = True BorderStyle = bsSingle Caption = 'Client TCP-IP CDM Rail ou USB - syst'#232'me LENZ' @@ -597,7 +597,7 @@ object FormPrinc: TFormPrinc Visible = False end object Image3feux: TImage - Left = 616 + Left = 600 Top = 8 Width = 33 Height = 57 @@ -1200,14 +1200,14 @@ object FormPrinc: TFormPrinc end object Label1: TLabel Left = 656 - Top = 116 + Top = 148 Width = 89 Height = 13 Caption = 'Nombre de trains : ' end object LabelNbTrains: TLabel Left = 760 - Top = 112 + Top = 144 Width = 9 Height = 19 Caption = '0' @@ -1255,9 +1255,9 @@ object FormPrinc: TFormPrinc end object ScrollBox1: TScrollBox Left = 648 - Top = 136 + Top = 168 Width = 537 - Height = 437 + Height = 405 Color = clWhite ParentColor = False TabOrder = 3 @@ -1266,7 +1266,7 @@ object FormPrinc: TFormPrinc Left = 656 Top = 8 Width = 249 - Height = 97 + Height = 129 Caption = 'Commande d'#39'accessoires' TabOrder = 4 object Label2: TLabel @@ -1295,7 +1295,7 @@ object FormPrinc: TFormPrinc Top = 32 Width = 57 Height = 21 - Hint = 'Adresse accessoire' + Hint = 'Adresse accessoire ou de CV' TabOrder = 0 Text = '1' end @@ -1331,6 +1331,17 @@ object FormPrinc: TFormPrinc WordWrap = True OnClick = ButtonEcrCVClick end + object ButtonLitCV: TButton + Left = 8 + Top = 96 + Width = 225 + Height = 25 + Hint = 'Lecture CV en mode direct sur voie de programmation' + Caption = 'Lecture CV - 1 '#224' 255 par le bus XpressNet' + Enabled = False + TabOrder = 4 + OnClick = ButtonLitCVClick + end end object ButtonTest: TButton Left = 912 @@ -1399,33 +1410,14 @@ object FormPrinc: TFormPrinc TabOrder = 11 OnClick = ButtonRepriseClick end - object EditGenli: TEdit - Left = 880 - Top = 160 - Width = 121 - Height = 21 - TabOrder = 12 - Visible = False - end - object Button1: TButton - Left = 1064 - Top = 216 - Width = 113 - Height = 25 - Caption = 'Envoi vers Genli' - TabOrder = 13 - Visible = False - OnClick = Button1Click - end object Button2: TButton Left = 992 Top = 96 Width = 97 Height = 25 Caption = 'Demande '#233'tat CTS' - TabOrder = 14 + TabOrder = 12 Visible = False - OnClick = Button2Click end object Timer1: TTimer Interval = 100 @@ -1454,7 +1446,7 @@ object FormPrinc: TFormPrinc OnClick = AffEtatDetecteurs end object ChronoDetect: TMenuItem - Caption = 'Chronologie des d'#233'tecteurs' + Caption = 'Chronologie des d'#233'tecteurs et aiguillages' Hint = 'Affiche la chronologie des d'#233'tecteurs' OnClick = ChronoDetectClick end @@ -1547,13 +1539,6 @@ object FormPrinc: TFormPrinc ' sur la voie de programmation' OnClick = LireunfichierdeCV1Click end - object LireunaccessoireversunfichierdeCV1: TMenuItem - Caption = 'Lire un accessoire vers un fichier de CV' - Hint = - 'Lire les CV d'#39'un accessoire branch'#233' sur la voie de programmation' + - ' vers un fichier' - OnClick = LireunaccessoireversunfichierdeCV1Click - end end end object ClientSocketCDM: TClientSocket diff --git a/UnitPrinc.pas b/UnitPrinc.pas index d6aae00..4511891 100644 --- a/UnitPrinc.pas +++ b/UnitPrinc.pas @@ -78,16 +78,14 @@ type OpenDialog: TOpenDialog; N1: TMenuItem; LireunfichierdeCV1: TMenuItem; - LireunaccessoireversunfichierdeCV1: TMenuItem; SaveDialog: TSaveDialog; N5: TMenuItem; Quitter1: TMenuItem; - EditGenli: TEdit; - Button1: TButton; Button2: TButton; Config: TMenuItem; Label1: TLabel; LabelNbTrains: TLabel; + ButtonLitCV: TButton; procedure FormCreate(Sender: TObject); procedure MSCommUSBLenzComm(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); @@ -134,11 +132,9 @@ type procedure ButtonEcrCVClick(Sender: TObject); procedure ButtonRepriseClick(Sender: TObject); procedure LireunfichierdeCV1Click(Sender: TObject); - procedure LireunaccessoireversunfichierdeCV1Click(Sender: TObject); procedure Quitter1Click(Sender: TObject); - procedure Button1Click(Sender: TObject); - procedure Button2Click(Sender: TObject); procedure ConfigClick(Sender: TObject); + procedure ButtonLitCVClick(Sender: TObject); private { Déclarations privées } @@ -156,7 +152,10 @@ tempoFeu = 100; MaxAcc = 2048; LargImg=50;HtImg=91; const_droit=2;const_devieD=1; // positions transmises par la centrale LENZ -const_devieG=3; +const_devieG_CDM=3; // positions transmises par cdm +const_devieD_CDM=2; // positions transmises par cdm +const_droit_CDM=0; // positions transmises par cdm + MaxElParcours=4000; @@ -171,7 +170,7 @@ type TBranche = record Taiguillage = record modele : integer; // 0=n'existe pas 1=aiguillage 2=TJD 3=TJS 4=aiguillage triple position, // position actuelle : 1=dévié 2=droit - Adrtriple, + Adrtriple, // 2eme adresse pour un aiguillage triple temps, // temps de pilotage (durée de l'impulsion en x 100 ms) inversion : integer; // pilotage inversé 0=normal 1=inversé vitesse : integer; // vitesse de franchissement de l"aiguillage en position déviée (60 ou 90) @@ -205,9 +204,9 @@ TMA = (valide,devalide); var ancien_tablo_signalCplx,EtatsignalCplx : array[0..MaxAcc] of word; AvecInitAiguillages,tempsCli,combine,NbreFeux,pasreponse,AdrDevie,precedent , NombreImages,signalCpx,branche_trouve,Indexbranche_trouve,Actuel,Signal_suivant, - Nbre_recu_cdm,Tempo_chgt_feux,Adj1,Adj2,protocole : integer; + Nbre_recu_cdm,Tempo_chgt_feux,Adj1,Adj2 : integer; Hors_tension2,traceSign,TraceZone,Ferme,parSocket,ackCdm, - NackCDM,MsgSim : boolean; + NackCDM,MsgSim,succes,recu_cv, TraceListe,clignotant,nack,Maj_feux_cours : boolean; branche : array [1..100] of string; @@ -219,8 +218,9 @@ const GrisF=$414141; clOrange=$0077FF; Feu_X=50;Feu_Y=91; + Max_Simule=1000; couleurTrain : array[1..8] of Tcolor = (clYellow,clLime,clOrange,clAqua,clFuchsia,clLtGray,clred,clWhite); - + var FormPrinc: TFormPrinc; ack,portCommOuvert,trace,AffMem,AfficheDet,CDM_connecte,parSocketCDM, @@ -240,11 +240,12 @@ var route : array[1..2000] of record Mem1,Mem2 : integer; end; - end; - Tablo_Simule : array[0..200] of + end; + + Tablo_Simule : array[0..Max_Simule] of record tick : longint; - Detecteur,etat : integer ; + Detecteur,Aiguillage,etat : integer ; end; Route : array[1..2000] of record Mem1,Mem2 : integer; @@ -3719,6 +3720,8 @@ begin Adr:=actuel; Btype:=BrancheN[branche_trouve_actuel,indexBranche_actuel].Btype; + //Affiche('Btype='+intToSTR(Btype)+' Actuel='+inTToSTR(actuel),clyellow); + if Btype=1 then // l'élément actuel est un détecteur begin // on part de l'actuel pour retomber sur le précédent @@ -3967,10 +3970,11 @@ begin if (aiguillage[Adr].modele=2) or (aiguillage[Adr].modele=3) then // TJD ou TJS begin - AdrTjdP:=aiguillage[Adr].Apointe; + // récupérer les élements de la TJD/S + AdrTjdP:=aiguillage[Adr].Apointe; // 2eme adresse de la TJD/S tjd:=aiguillage[Adr].modele=2; tjs:=aiguillage[Adr].modele=3; - tjsc1:=aiguillage[Adr].tjsint; // adresses de la courbe de la TJD + tjsc1:=aiguillage[Adr].tjsint; // adresses de la courbe de la TJS tjsc2:=aiguillage[AdrTjdP].tjsint; tjsc1B:=aiguillage[Adr].tjsintB; tjsc2B:=aiguillage[AdrTjdP].tjsintB; @@ -4122,43 +4126,108 @@ begin AfficheDebug('139 - Erreur fatale - Aucun cas TJD/S : adr='+IntToSTR(Adr)+' '+intToSTR(AdrTJDP)+' prec='+IntTOSTR(prec),clred); suivant_alg3:=9999;exit; end; + if (aiguillage[Adr].modele=4) then // aiguillage triple begin - // aiguillage triple pris en pointe - Adr2:=aiguillage[Adr].AdrTriple; - // attention la lecture d'un aiguillage triple est différente suivant la connexion avec CDM - // ou avec l'interface - if ( CDM_connecte and (aiguillage[Adr].position=const_droit) ) or - ( not(CDM_connecte) and (aiguillage[Adr].position=const_droit) and (aiguillage[Adr2].position=const_droit) ) then - begin - if NivDebug=3 then AfficheDebug('Aiguillage triple droit',clYellow); - typeGen:=aiguillage[Adr].AdroitBis+1; - //TSuiv=aiguillage[Adr].AdroitB; - Adr:=aiguillage[Adr].Adroit; - end; - if ( CDM_connecte and (aiguillage[Adr].position=const_devieG) ) or - ( not(CDM_connecte) and (aiguillage[Adr].position<>const_droit) and (aiguillage[Adr2].position=const_droit) ) then - begin - if NivDebug=3 then AfficheDebug('Aiguillage triple dévié1 (gauche)',clYellow); - typeGen:=aiguillage[Adr].AdevieBis+1; - //TSuiv=aiguillage[Adr].AdevieB; - Adr:=aiguillage[Adr].Adevie; - end; - if ( CDM_connecte and (aiguillage[Adr].position=const_devieG) ) or - ( not(CDM_connecte) and (aiguillage[Adr].position=const_droit) and (aiguillage[Adr2].position<>const_droit) ) then - begin - if NivDebug=3 then AfficheDebug('Aiguillage triple dévié2 (droit)',clYellow); - typeGen:=aiguillage[Adr].Adevie2Bis+1; - //TSuiv=aiguillage[Adr].Adevie2B; - Adr:=aiguillage[Adr].Adevie2; - end; - if ((aiguillage[Adr].position<>const_droit) and (aiguillage[Adr2].position<>const_droit) ) then - begin - AfficheDebug('Aiguillage triple '+IntToSTR(Adr)+' : configuration des aiguilles interdite',clYellow); - Affiche('Aiguillage triple : '+IntToSTR(Adr)+' configuration des aiguilles interdite',clRed); - //TSuiv='Z'; - suivant_alg3:=9999;exit; // pour échappement - end; + Adr2:=aiguillage[Adr].AdrTriple; + if (aiguillage[adr].Apointe=prec) then + begin + // aiguillage triple pris en pointe + //Affiche('position='+intToSTR(aiguillage[Adr].position),clyellow); + if (aiguillage[Adr].position=const_droit) and (aiguillage[Adr2].position=const_droit) then + begin + if NivDebug=3 then AfficheDebug('Aiguillage triple pris en pointe droit',clYellow); + typeGen:=aiguillage[Adr].AdroitBis+1; + A:=aiguillage[Adr].AdroitB; + Adr:=aiguillage[Adr].Adroit; + if A='Z' then TypeEl:=1 else TypeEL:=2; //TypeEL=(1=détécteur 2=aig 3=aig Bis) + if Abis=1 then TypeEl:=3; + trouve_element(Adr,TypeEl); // branche_trouve IndexBranche_trouve + typeGen:=BrancheN[branche_trouve,IndexBranche_trouve].BType; + suivant_alg3:=adr;exit; + end; + if (aiguillage[Adr].position<>const_droit) and (aiguillage[Adr2].position=const_droit) then + begin + if NivDebug=3 then AfficheDebug('Aiguillage triple dévié1 (à gauche)',clYellow); + typeGen:=aiguillage[Adr].AdevieBis+1; + A:=aiguillage[Adr].AdevieB; + Adr:=aiguillage[Adr].Adevie; + if A='Z' then TypeEl:=1 else TypeEL:=2; //TypeEL=(1=détécteur 2=aig 3=aig Bis) + if Abis=1 then TypeEl:=3; + trouve_element(Adr,TypeEl); // branche_trouve IndexBranche_trouve + typeGen:=BrancheN[branche_trouve,IndexBranche_trouve].BType; + suivant_alg3:=adr;exit; + end; + if (aiguillage[Adr].position=const_droit) and (aiguillage[Adr2].position<>const_droit) then + begin + if NivDebug=3 then AfficheDebug('Aiguillage triple dévié2 (à droite)',clYellow); + typeGen:=aiguillage[Adr].Adevie2Bis+1; + A:=aiguillage[Adr].Adevie2B; + Adr:=aiguillage[Adr].Adevie2; + if A='Z' then TypeEl:=1 else TypeEL:=2; //TypeEL=(1=détécteur 2=aig 3=aig Bis) + if Abis=1 then TypeEl:=3; + trouve_element(Adr,TypeEl); // branche_trouve IndexBranche_trouve + typeGen:=BrancheN[branche_trouve,IndexBranche_trouve].BType; + suivant_alg3:=adr;exit; + end; + begin + s:='Aiguillage triple '+IntToSTR(Adr)+' : configuration des aiguilles interdite'; + if CDM_connecte then s:=s+': '+IntToSTR(aiguillage[Adr].position); + AfficheDebug(s,clYellow); + Affiche(s,clRed); + suivant_alg3:=9999;exit; // pour échappement + end; + end + else + begin + if NivDebug=3 then AfficheDebug('Aiguillage triple pris en talon',clyellow); + if alg=2 then // on demande d'arreter si l'aiguillage en talon est mal positionné + begin + if (aiguillage[adr].position=const_droit) and (aiguillage[adr2].position=const_droit) then + begin + if prec<>aiguillage[Adr].Adroit then + begin + if NivDebug=3 then AfficheDebug('135.3 - Aiguillage '+intToSTR(adr)+'triple mal positionné',clyellow); + suivant_alg3:=9998;exit; + end + else + begin + if NivDebug=3 then AfficheDebug('135.4 - Aiguillage '+intToSTR(adr)+'triple bien positionné',clyellow); + end; + end; + if (aiguillage[adr].position<>const_droit) and (aiguillage[adr2].position=const_droit) then + begin + if prec<>aiguillage[Adr].Adevie then + begin + if NivDebug=3 then AfficheDebug('135.3 - Aiguillage '+intToSTR(adr)+'triple mal positionné',clyellow); + suivant_alg3:=9998;exit; + end + else + begin + if NivDebug=3 then AfficheDebug('135.4 - Aiguillage '+intToSTR(adr)+'triple bien positionné',clyellow); + end; + end; + if (aiguillage[adr].position=const_droit) and (aiguillage[adr2].position<>const_droit) then + begin + if prec<>aiguillage[Adr].Adevie2 then + begin + if NivDebug=3 then AfficheDebug('135.3 - Aiguillage '+intToSTR(adr)+'triple mal positionné',clyellow); + suivant_alg3:=9998;exit; + end + else + begin + if NivDebug=3 then AfficheDebug('135.4 - Aiguillage '+intToSTR(adr)+'triple bien positionné',clyellow); + end; + end; + end; + A:=aiguillage[Adr].ApointeB; + Adr:=aiguillage[Adr].Apointe; + if A='Z' then TypeEl:=1 else TypeEL:=2; //TypeEL=(1=détécteur 2=aig 3=aig Bis) + if Abis=1 then TypeEl:=3; + trouve_element(Adr,TypeEl); // branche_trouve IndexBranche_trouve + typeGen:=BrancheN[branche_trouve,IndexBranche_trouve].BType; + suivant_alg3:=Adr;exit; + end; end; end; suivant_alg3:=adr; @@ -5122,8 +5191,6 @@ begin // signaux traités spécifiquement if (AdrFeu=201) then begin - //sprintf(Affiche,"Aiguille 27=%d \r\n",aiguillage[27].position);Display(Affiche); - // sprintf(Affiche,"Aiguille 31=%d \r\n",aiguillage[31].position);Display(Affiche); if ((aiguillage[28].position<>const_droit) and (aiguillage[29].position<>const_droit) and (aiguillage[31].position=2)) then // attention spécial Maj_Etat_Signal(AdrFeu,blanc) else Maj_Etat_Signal(AdrFeu,violet); @@ -5508,7 +5575,7 @@ begin ancien_detecteur[Adresse]:=detecteur[Adresse]; detecteur[Adresse]:=etat; detecteur_chgt:=Adresse; - + // mise a jour du tableau evt de fronts descendants if ancien_detecteur[Adresse] and not(detecteur[Adresse]) and (N_Event_det<20) then begin @@ -5517,7 +5584,7 @@ begin event_det[N_event_det]:=Adresse; calcul_zones; // en avant les calculs end; - + // stocke les changements d'état des détecteurs dans le tableau chronologique if (N_Event_tick255 then Affiche('Erreur Recu CV>255',clRed) + cvLoc:=ord(chaineINT[1]); + //Affiche('Réception CV'+IntToSTR(cvLoc)+' à '+IntToSTR(ord(chaineINT[2])),clyellow); + if cvLoc>255 then Affiche('Erreur Recu CV>255',clRed) else begin - tablo_cv[cv]:=ord(chaineINT[2]); + tablo_cv[cvLoc]:=ord(chaineINT[2]); inc(N_Cv); // nombre de CV recus end; + recu_cv:=true; + delete(chaineInt,1,3); decode_chaine_retro:=chaineINT; exit; end; @@ -6067,7 +6147,7 @@ begin begin With Formprinc.MSCommUSBLenz do begin - Affiche('Demande ouverture com'+intToSTR(nuMPort)+':'+ConfStCom+','+IntToSTR(protocole),CLYellow); + Affiche('Demande ouverture com'+intToSTR(nuMPort)+':'+ConfStCom+' protocole '+IntToSTR(protocole),CLYellow); Settings:=ConfStCom; // COMx:vitesse,n,8,1 if protocole>=4 then Handshaking:=0 {0=aucun 1=Xon-Xoff 2=cts 3=RTS-Xon-Xoff 4=5=protocoles "maison"} else Handshaking:=protocole; @@ -6168,8 +6248,8 @@ begin //créée la fenêtre TCO FormTCO:=TformTCO.Create(Self); FormTCO.show; - construit_TCO; - affiche_TCO; + //construit_TCO; + //affiche_TCO; //Formprinc.Hide; end; @@ -6203,14 +6283,14 @@ begin begin ButtonEcrCV.Enabled:=true; LireunfichierdeCV1.enabled:=true; - LireunaccessoireversunfichierdeCV1.Enabled:=true; + ButtonLitCV.Enabled:=true; end else With Formprinc do begin ButtonEcrCV.Enabled:=false; + ButtonLitCV.Enabled:=false; LireunfichierdeCV1.enabled:=false; - LireunaccessoireversunfichierdeCV1.Enabled:=false; end ; // Initialisation des images des signaux @@ -6226,6 +6306,7 @@ begin // initialisation de la chronologie des évènements détecteurs for i:=0 to Max_Event_det_tick do begin + event_det_tick[i].aiguillage:=-1; for j:=1 to 1100 do event_det_tick[i].detecteur[j]:=-1; // initialiser les détecteurs à -1 event_det_tick[i].traite:=false ; // non traité @@ -6236,14 +6317,13 @@ begin N_Event_tick:=0 ; // dernier index NombreImages:=0; - + // énumération des ports USB //EnumerateDevices; //for i:=1 to NumLine do //begin // if pos('Ports',Line[i])<>0 then Affiche(Line[i],clyellow); //end; - //essai // event_det[1]:=527; // event_det[2]:=520; @@ -6253,11 +6333,10 @@ begin //traceDet:=true; // calcul_zones; //maj_feu(201); - //etat_signal_suivant(201,1); - //Aiguille_deviee(462); - //NivDebug:=3; - //formdebug.Show; +// 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); @@ -6275,10 +6354,8 @@ begin //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); @@ -6408,14 +6485,25 @@ begin //simulation - if index_simule<>0 then + if index_simule<>0 then begin if not(MsgSim) then begin Affiche('Simulation en cours ',Cyan);MsgSim:=true;end; while tick=Tablo_simule[i_simule+1].tick do begin inc(I_simule); - Affiche('Simulation 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 + // evt détecteur ? + if Tablo_simule[i_simule].detecteur<>0 then + begin + Affiche('Simulation 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 + Affiche('Simulation tick='+IntToSTR(tick)+' aig='+intToSTR(Tablo_simule[i_simule].aiguillage)+'='+IntToSTR(Tablo_simule[i_simule].etat),Cyan); + Event_Aig(Tablo_simule[i_simule].Aiguillage, Tablo_simule[i_simule].etat); // créer évt aiguillage + end; + end; if i_Simule>=Index_simule then begin @@ -6441,7 +6529,19 @@ procedure TFormPrinc.ButtonCommandeClick(Sender: TObject); var adr,valeur,erreur : integer; begin val(EditAdresse.text,adr,erreur); + if (erreur<>0) or (adr<1) or (adr>2048) then + begin + EditAdresse.text:='1'; + exit; + end; + val(EditVal.Text,valeur,erreur); + if (erreur<>0) or (valeur<0) or (valeur>255) then + begin + EditVal.text:='1'; + exit; + end; + pilote_acc(adr,valeur,aig); end; @@ -6595,7 +6695,6 @@ begin ClientSocketLenz.Close; end; - function cde_cdm(s : string) : string; var i : integer; begin @@ -6603,8 +6702,6 @@ begin cde_cdm:='0'+IntToSTR(i)+s; end; - - procedure TFormPrinc.locoClick(Sender: TObject); begin // vitesse et direction 18 pas @@ -6626,16 +6723,23 @@ begin end; procedure TFormPrinc.Etatdesaiguillages1Click(Sender: TObject); -var i : integer; +var i,j,model : integer; s : string; begin Affiche('les positions des aiguillages BIS sont les mêmes que leurs homologues non bis',Cyan); for i:=1 to MaxAcc do begin - if aiguillage[i].modele<>0 then + model:=aiguillage[i].modele ; + 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 model=4 then + begin + j:=aiguillage[i].AdrTriple; + s:=s+' Aig '+IntToSTR(j)+': '+intToSTR(aiguillage[j].position); + if aiguillage[j].position=1 then s:=s+' (dévié)' else s:=s+' (droit)'; + end; Affiche(s,clWhite); end; end; @@ -6696,8 +6800,8 @@ begin AfficheDebug('Lenz connecté ',clYellow); parSocket:=True; ButtonEcrCV.Enabled:=true; + ButtonLitCV.Enabled:=true; LireunfichierdeCV1.enabled:=true; - LireunaccessoireversunfichierdeCV1.Enabled:=true; LabelTitre.caption:=titre+' Interface connectée par Ethernet'; end; @@ -6717,7 +6821,7 @@ end; // réception d'un message de CDM rail procedure TFormPrinc.ClientSocketCDMRead(Sender: TObject;Socket: TCustomWinSocket); - var i,j,k,erreur, adr,adr2,etat,etataig : integer ; + var i,j,k,erreur, adr,adr2,etat,etataig,etatAig2 : integer ; s,ss : string; traite,sort : boolean; begin @@ -6756,14 +6860,50 @@ begin exit; end; val(ss,etat,erreur); + // Affiche('Aiguillage CDM'+intToSTR(adr)+'='+IntToStr(etat),clLime); + // conversion en position : + // CDM: 0=droit 1=droite 3=gauche + // logiciel : 1=dévié 2=droit + + // aiguillage normal + if aiguillage[adr].modele=1 then + begin + if etat=0 then etatAig:=2 else etatAig:=1; + aiguillage[adr].position:=etatAig; + aiguillageB[adr].position:=etatAig; + Event_Aig(adr,etatAig); + end; + // TJD TJS + if (aiguillage[adr].modele=2) or (aiguillage[adr].modele=3) then + begin + adr2:=aiguillage[adr].Apointe; // 2eme adresse de la TJD + case etat of + 1 : begin etatAig:=1;EtatAig2:=2;end; + 4 : begin etatAig:=1;EtatAig2:=1;end; + 5 : begin etatAig:=2;EtatAig2:=1;end; + 0 : begin etatAig:=2;EtatAig2:=2;end; + end; + aiguillage[adr].position:=etatAig;aiguillage[adr2].position:=etatAig2; + Event_Aig(adr,etatAig); + Event_Aig(adr2,etatAig2); + end; + if aiguillage[adr].modele=4 then // aiguillage triple + begin + // état de l'aiguillage 1 + if (etat=0) or (etat=2) then etatAig:=2; + if etat=3 then etatAig:=1; + aiguillage[adr].Position:=etatAig; + // état de l'aiguillage 2 + adr2:=aiguillage[adr].AdrTriple; + if (etat=0) or (etat=3) then etatAig2:=2; + if etat=2 then etatAig2:=1; + aiguillage[adr2].Position:=etatAig2; + Event_Aig(adr,etatAig); + Event_Aig(adr2,etatAig2); + end; - // conversion en position : 1=dévié (CDM envoie 2 ou 1) 2=droit (CDM envoie 0) - if etat=0 then etatAig:=2 else etatAig:=1; - aiguillage[adr].position:=etatAig; - aiguillageB[adr].position:=etatAig; - Event_Aig(adr); Tempo_chgt_feux:=10; // demander la mise à jour des feux - //Affiche('Aiguillage '+intToSTR(adr)+'='+IntToStr(etatAig),clYellow); + //Affiche(recuCDM,CLOrange); //if length(recuCDM)>80 then Affiche(copy(recuCDM,80,length(recuCDM)-80),clOrange); end; @@ -6874,7 +7014,7 @@ begin Affiche('Version 1.3 : Décodeur Unisemaf fonctionnel - Lecture/écriture des CV',clLime); Affiche(' Protocoles variables de l''interface',clLime); Affiche(' Configuration statique modifiable dans menu',clLime); - + Affiche('Version 1.31 : Correction des positions aiguillages triples et TJD',clLime); end; procedure TFormPrinc.ClientSocketLenzDisconnect(Sender: TObject; @@ -6886,25 +7026,29 @@ end; procedure TFormPrinc.ChronoDetectClick(Sender: TObject); var i,j,etat : integer; s : string; - trouve : boolean; begin for i:=1 to N_Event_tick do begin - s:=IntToSTR(i)+' Tick='+IntToSTR(event_det_tick[i].tick)+' Det='; - trouve:=false; + for j:=1 to 1100 do begin etat:=event_det_tick[i].detecteur[j]; if etat<>-1 then begin - s:=s+IntToSTR(j)+'='+intToSTR(etat); - //s:=s+' Train n°'+intTostr(event_det_tick[i].Train); + s:=IntToSTR(i)+' Tick='+IntToSTR(event_det_tick[i].tick); + s:=s+' Det='+IntToSTR(j)+'='+intToSTR(etat); s:=s+' Det suiv='+intTostr(event_det_tick[i].suivant); - - trouve:=true; + Affiche(s,clyellow); end; end; - if trouve then Affiche(s,clyellow); + + etat:=event_det_tick[i].aiguillage; + if etat<>-1 then + begin + s:=IntToSTR(i)+' Tick='+IntToSTR(event_det_tick[i].tick); + s:=s+' Aig='+intToSTR(etat)+'='+intToSTR(event_det_tick[i].position); + Affiche(s,clyellow); + end; end; end; @@ -6922,8 +7066,19 @@ var adr,valeur,erreur : integer; begin // doc XpressNet page 55 val(EditAdresse.text,adr,erreur); + if (erreur<>0) or (Adr>255) or (Adr<0) then + begin + EditAdresse.Text:='1'; + exit; + end; + val(EditVal.Text,valeur,erreur); - if (Adr>255) or (valeur>255) then exit; + if (erreur<>0) or (valeur<0) or (valeur>255) then + begin + EditAdresse.text:='1'; + exit; + end; + //s:=#$ff+#$fe+#$23+#$1e+Char(adr)+Char(valeur); //CV de 512 à 767 V3.4 //s:=#$ff+#$fe+#$23+#$1d+Char(adr)+Char(valeur); //CV de 256 à 511 V3.4 s:=#$23+#$16+Char(adr)+Char(valeur); //CV de 1 à 256 @@ -6996,7 +7151,7 @@ begin Lire_fichier_CV; end; -procedure TFormPrinc.LireunaccessoireversunfichierdeCV1Click(Sender: TObject); +procedure TFormPrinc.ButtonLitCVClick(Sender: TObject); var s,sa: string; fte : textfile; i,cv,valeur,erreur : integer; @@ -7005,66 +7160,56 @@ begin //s:='C:\Program Files (x86)\Borland\Delphi7\Projects\Signaux_complexes_GL'; N_Cv:=0; // nombre de CV recus à 0 sa:=''; - //for cv:=1 to 255 do + Affiche('Lecture CV',clyellow); + + val(EditAdresse.Text,cv,erreur); + if (erreur<>0) or (cv>255) or (cv<0) then begin - cv:=3; - trace:=true; - //s:=#$ff+#$fe+#$22+#$15+Char(cv); //CV de 1 à 256 (V3.0) - s:=#$22+#$18+Char(cv); //CV de 1 à 255 + 1024 (V3.6) - s:=checksum(s); - // envoi(s); // envoi de la trame et attente Ack, la premiere trame fait passer la centrale en mode programmation (service) - envoi_ss_ack(s); - Tempo(1); + EditAdresse.Text:='1'; + exit; + end; + //trace:=true; - s:=#$21+#$10+Char(cv); // demande d'envoi du résultat du mode service - s:=checksum(s); - //envoi(s); - envoi_ss_ack(s); - Tempo(1); - // attente de la réponse de la centrale - tablo_CV[cv]:=0; - i:=0; - repeat - Tempo(2); // attend 200 ms - inc(i); - // N_cv:=cv; - until (N_cv=cv) or (i>4); - if (i>4) then - begin - Affiche('Erreur attente trop longue CV',clred); - exit; - end; - //tablo_cv[cv]:=123; - sa:=sa+'Cv'+IntToSTR(cv)+'='+IntToSTR(Tablo_cv[cv])+' '; - if cv mod 9=0 then - begin - Affiche(sa,clyellow);sa:=''; - end; - end; - Affiche(sa,clyellow);sa:=''; + s:=#$22+#$15+Char(cv); //CV de 1 à 256 (V3.0) + //s:=#$22+#$18+Char(cv); //CV de 1 à 255 + 1024 (V3.6) + s:=checksum(s); + // envoi de la trame : fait passer la centrale en mode programmation (service) + envoi_ss_ack(s); - with FormPrinc.SaveDialog do + // attendre la trame 01 04 05 (env 1s) + succes:=false;i:=0; + repeat + Application.processMessages; + Sleep(100); + inc(i); + until succes or (i>20); + + if succes then begin - InitialDir:=s; - title:='Ecrire un nom de fichier dans lequel sauvegarder les CV'; - DefaultExt:='txt'; - Filter:='Fichiers texte (*.txt)|*.txt|Tous fichiers (*.*)|*.*'; - - if Execute then + recu_cv:=false; + //Affiche('reçu trame succes',clyellow); + s:=#$21+#$10; // demande d'envoi du résultat du mode service + s:=checksum(s); + //envoi(s); + envoi_ss_ack(s); + Tempo(1); + // attente de la réponse de la centrale + i:=0; + repeat + Tempo(2); // attend 200 ms + inc(i); + until recu_cv or (i>4); + if (i>4) then begin - s:=FileName; - assignFile(fte,s); - rewrite(fte); - Writeln(fte,'cv valeur'); - for cv:=1 to 255 do - begin - s:=IntToSTR(cv)+' '+intToSTR(tablo_CV[cv]); - Writeln(fte,s); - end; - closeFile(fte); + Affiche('Erreur attente trop longue CV',clred); + exit; end; - end; + sa:=sa+'Cv'+IntToSTR(cv)+'='+IntToSTR(Tablo_cv[cv])+' '; + Affiche(sa,clyellow);sa:=''; + end + else + Affiche('Pas de réponse de l''interface',clOrange); end; @@ -7073,25 +7218,6 @@ begin close; end; -procedure TFormPrinc.Button1Click(Sender: TObject); -var s : string; -begin - s:=EditGenli.text; //+#13+#10+#10; - terminal:=true; - if portCommOuvert then - begin - Affiche('Envoi a genli de '+ EditGenli.text,clorange); - envoi_ss_ack(s); - end; -end; - -procedure TFormPrinc.Button2Click(Sender: TObject); -begin - if MSCommUSBLenz.CTSHolding=true then Affiche('CTS=1',Clyellow) - else Affiche('CTS=0',clyellow); - -end; - procedure TFormPrinc.ConfigClick(Sender: TObject); begin Tformconfig.create(self); @@ -7100,5 +7226,7 @@ begin end; +begin end. + diff --git a/UnitSimule.dcu b/UnitSimule.dcu index eb6085e55281eead21e5eac35dcbb67289cc1aba..57f6b2da2a7d62eb017ff629c0a720a75d47aabb 100644 GIT binary patch delta 2428 zcmb7GeQ;A%7Qg4bm)Ap@CTU4S%!cwBu~wu^sl}yi(SoHG0j;!UkoAL@zO+x%l%}Zz zj7zA{9lIfp@lh4WFC20F9uS>@jyk2TGwSR*gE|iTq5F^Pz{nqqJ3G_G+U&V$QwrOe zoqd^mK7QwS&b{a4<-Pp0;_JG?zX{>`Iv_;dU1p}xzo6zWvqi+6?J+aaYIgTWjb$B? z?jK*x)Hjr$E#LiPXTh3C#0+;C_msAWI_;Z6JMWvK-ClbBn@swbnJ=$BZif)fvxTFZ zjgE_NY&&kwds12cPPmqC>4_!cJ<&e#P`K9C)D!RS6P4lGf<`kG?dj|jWlU*Jblj4N zGsSIH7X>%Hdr(>E7fW1ilAYTplrVc@kN#21tP1GP%hB)u5`BGDphmZ^k0p%wL!oHY z`2P3KQ$_At9hcQa%B&ZPuGw_z(>?c!3#Fu&tF1;f;tgo!TB{N3FydYZ>d+S{8P}Ca z!iac|jq6}~-9m>4rPPdg+~|)--2c$EzMgo(G`wD`*tzHzW3u9jISX1FoYyyhB;()C z8ONZq!Pw<>s+X#dhbtXTW-JsncjsE&yY8Q%N5tLbx^8{w^v&19&rjYeNCf^=(6p6$ z(JsoZbIwX2tHc$wnq3>}%3MN-y{>FFn`~)dGy0q0Mpm;gm7N9<;s7sseZ`uTz+kfbXnx?)BEK#altOUM_A(p1he!5AbJw|G)2S-I6+!S|QVJ7;W#W;94Eo>W(2j zy>8;HL|Kp2Gn#W!`zBC`RQptD%G)=Z7&&k`Vc+QXk*6<*Qts^L`u(G>{SPZvvSf?v zOg=ow*nYIWE4ky>$``33x#f_0nzuM{b~XjLr*yL-Pb0gWI$Ha9YWkEZ?@V&zX;o&A z&(8kHdVKz(R5VsG2_z|X?A%or!0$j6N19!7>se(Q$9S{AWHy;E#CBFTQjl+CL}WQ*x|OUZk6+3AG`G1C80)598A_kY?A)D`!CIVfQ7DH0PXwV=`NuFU0oL46G%d zsiEPU@O7H z1iK0L5IjThD8Wqx2MC@ec%Gnv;6;L$2$C-oyh3n0!A64D3EBwWBzS`0Ai6 zdA$}Ztm}N$$uh<6&4tFRal(s$9>wmv5(wgFlEk6Fj8!(vp%?UqyIxa^yu0RLYVY^K`fQ~78!kl;?ywWC#CqKBQ6s{cK`ce_1oEE=emAaavQA!g zb#efOrs`!4{H{V#c0_tX{d_O?DfDB~TO7RDi%t~5eiSHbc1c+~D5W+eWkXuZwHYZJ zhox*fl#|cpUby_*lwfJh*WH*C-bXM0Lp^wrGR6 z9w&!!P!YrUcV+Sro>s*nwAmP|voUta#@NR;#(tLAa*eT!#@GiMWB<|^%gkf!!aT+n k+8JxNGd5&r?3~@hU}+(Pn+hin<7%fkjQ2RL&;3>Z0m$`^y8r+H delta 1901 zcmZux4NOy46u#&5@idi%s+q!D=M!PRRVXW0=-shS}j$H2_t)i2) zaeFiiPgUnoabrU;(CBMo+p2S7N*e?9O>BO3PHc&{%GX%i#1t;62-Xw_16-n4Gjz_C zUl(8e!OrFz)(Ca_9*Imy16TV+*UY?fsvdkQia>+u{h)uxx(F0;|^H#s6dm)d{@zUf^Ltc|E>aF zi-{?)S)l9=1l-L5kLhnkZfXn!y>5$D)#;OGUlkS4Jhq^^RR3h=Pa^*FW8>)5yx?xJ z7^Mf*)kFGO8P4j1n67fo-wWK~&!7B^*PI+O=s>+>&}m}W zf9iL}Wl5xAOk$4|Rc#6DAVwWBB&lr)3-VjfTgN9RD%LLgsxxBeR%b-`ossk?rbbZ_ zxNLydYV!Mw`KJKPjpxNmwUuXAs;(Hn`hi`yBvGc`-N-LAfwlpP<(iAcN17>H3XB;8U6E#{NO}(u&Vr@U=#=NcNlS9be@Qlyu!QIPP(np+pz9jUKr?R95-vs;Zj?Ms-;H>c z?M4S<{DbH!L&kr6g~-fmXtp)v=OZvjD>7MfDn1593%baVL oId@d%TwE;Ya$`B?j~(yDI4$eNdD`(lEFfky9mNb;J#A00 then - begin + if i<>0 then + begin Delete(s,1,i+4); val(s,k,erreur); if intervalle<>0 then k:=Index_Simule*Intervalle*10+tick+80 else // démarre dans 8s k:=Index_Simule+tick+80 ; Tablo_simule[index_simule].tick:=k; + + // détecteur? i:=pos('Det=',s); - if i<>0 then - begin + if i<>0 then + begin Delete(s,1,i+3); val(s,k,erreur); Tablo_simule[index_simule].detecteur:=k; i:=pos('=',s); - if i<>0 then - begin + if i<>0 then + begin Delete(s,1,i); val(s,k,erreur); Tablo_simule[index_simule].etat:=k; - s:='Tick='+intToSTR(Tablo_simule[index_simule].tick)+ + s:=IntToSTR(Index_simule)+' Tick='+intToSTR(Tablo_simule[index_simule].tick)+ ' Detecteur='+intToSTR(Tablo_simule[index_simule].detecteur)+ '='+intToSTR(Tablo_simule[index_simule].etat); Affiche(s,ClLime); - - inc(index_simule); + + inc(index_simule); end; - end; + end; + + // aiguillage? + i:=pos('Aig=',s); + if i<>0 then + begin + Delete(s,1,i+3); + val(s,k,erreur); + Tablo_simule[index_simule].aiguillage:=k; + i:=pos('=',s); + if i<>0 then + begin + Delete(s,1,i); + val(s,k,erreur); + Tablo_simule[index_simule].etat:=k; + + s:=IntToSTR(Index_simule)+' Tick='+intToSTR(Tablo_simule[index_simule].tick)+ + ' Aiguillage='+intToSTR(Tablo_simule[index_simule].aiguillage)+ + '='+intToSTR(Tablo_simule[index_simule].etat); + Affiche(s,ClLime); + + inc(index_simule); + end; + end; end; - sortie:=eof(fte) or (index_simule>199); + sortie:=eof(fte) or (index_simule>Max_Simule); until sortie ; + if index_simule>Max_Simule then Affiche('Tableau maximal atteint',clred); Affiche('Intervalle='+intToSTR(intervalle),clyellow); dec(index_simule); closeFile(fte); FormSimulation.Close; - end; end; @@ -102,7 +126,7 @@ procedure TFormSimulation.EditIntervalleKeyPress(Sender: TObject;var Key: Char); var erreur : integer; begin Val(EditIntervalle.Text,intervalle,erreur); - if (intervalle<0) then Intervalle:=1; + if (intervalle<0) then Intervalle:=1; end; end. diff --git a/UnitTCO.dcu b/UnitTCO.dcu index 7182d51ed93440983c26d3ed3b06c97caa421072..e5fbaff4b788f8236d248e01fce7dba77a48508c 100644 GIT binary patch literal 52601 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 at~EryR*f2g;U7;={W?uf#fHSiVUmJsJ=ku9& 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 then c:=s[1]; + until ((c<>'/') and (s<>'')) or eof(fichier) ; + lit_ligne:=s; + end; + +begin + try + assignFile(fichier,'tco.cfg'); + reset(fichier); + except + exit; + end; + + x:=1;y:=1;NbreCellX:=0;NbreCellY:=0; + + //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); + setlength(tco,NbreCellX+1,NbreCellY+1); + setlength(Tampontco,NbreCellX+1,NbreCellY+1); + + // 2eme passe : lire le fichier + while not eof(fichier) do + begin + s:=lit_ligne; + if s[1]<>'/' then + begin + repeat + i:=pos('(',s); + if i=0 then begin closefile(fichier);exit;end; + delete(s,i,1); + + 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); + + 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; + delete(s,1,i); + + 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); + inc(x); + + until s=''; + end; + inc(y);x:=1; + end; + closefile(fichier); + Affiche('Dimensions du tco : '+intToSTR(NbreCellX)+'x'+intToSTR(NbreCellY),clyellow); + // adapter l'image au nombre de cellules + FormTCO.ImageTCO.Width:=NbreCellX*LargeurCell+2; + FormTCO.ImageTCO.Height:=NbreCellY*HauteurCell+2; +end; + +procedure sauve_fichier_tco; +var fichier : textfile; + s : string; + x,y,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 '); + writeln(fichier,'/Dalle TCO'); + for y:=1 to NbreCellY do + begin + s:=''; + 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)+')'; + end; + writeln(fichier,s); + end; + closefile(fichier); + Affiche('TCO sauvegardé',clyellow); +end; + + +procedure TformTCO.grille; var x,y : integer; r : Trect; begin HtImageTCO:=FormTCO.ImageTCO.Height; HtImageTCO:=FormTCO.ImageTCO.Height; LargImageTCO:=FormTCO.ImageTCO.Width; - - With FormTCO.ImageTCO.canvas do - begin - Brush.Style:=bsSolid; - Brush.Color:=clBlack; - pen.color:=clyellow; - r:=rect(1,1,LargImageTCO,HtImageTco); - FillRect(r); - - pen.color:=$707070; - for x:=1 to NbreCellx do + With ImageTCO.canvas do + begin + pen.color:=ClGrille; + for x:=1 to NbreCellX do begin moveto(x*LargeurCell,1); LineTo(x*LargeurCell,HtImageTCO); @@ -92,105 +321,128 @@ begin end; // élément de voie horizontale -procedure dessin_voie(x,y : integer); -var x1,y1 : integer; - r : Trect; -begin - with FormTCO.ImageTCO.Canvas do - begin - x1:=x*LargeurCell; - y1:=y*HauteurCell; - end; - with formTCO.ImageTCO.canvas do - begin - r:=Rect(x1,y1+(HauteurCell div 2)-3,x1+LargeurCell,y1 + (HauteurCell div 2)+3); - Brush.COlor:=ClRed; - FillRect(r); - end; -end; - -// aiguillage pointe à gauche, aiguillage gauche -procedure TFormTCO.dessin_AigPG_AG(x,y : integer;couleur : Tcolor); -var x0,y0,x1,y1,x2,y2,x3,y3,x4,y4,jy1,jy2 : integer; +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; + s : string; begin x0:=(x-1)*LargeurCell; y0:=(y-1)*HauteurCell; - with ImageTCO.canvas do + with canvas do begin - Brush.Color:=couleur; - pen.color:=couleur; - Pen.Mode:=PmCopy; - 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,jy2); + Brush.Color:=Fond; + r:=Rect(x0,y0,x0+LargeurCell,y0+HauteurCell); FillRect(r); - //brush.color:=clblue; - x1:=x0+(largeurCell div 2); - y1:=jy1; + // bande blanche + if (x<=NbreCellX) and (y<=NbreCellY) then + begin + Adr:=TCO[x,y].Adresse; + if Detecteur[Adr] then + 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 + r:=Rect(x0,jy1,x0+LargeurCell,jy2); + FillRect(r); + 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 + r:=Rect(x0,jy1,x0+LargeurCell,jy2); + FillRect(r); + end; +end; + +// élément 10 +procedure TformTCO.dessin_Diag1(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; + s : string; +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-3; 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)]); + y3:=y0+4; + x4:=x0+4; + y4:=y0+hauteurCell; + Brush.Color:=couleur; + pen.color:=couleur; + + 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(x,y : integer;couleur : Tcolor); -var x0,y0,x1,y1,x2,y2,x3,y3,x4,y4,jy1,jy2 : integer; +// élément 11 +procedure TformTCO.dessin_Diag2(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; + s : string; begin x0:=(x-1)*LargeurCell; y0:=(y-1)*HauteurCell; - with ImageTCO.canvas do + with canvas do begin - Brush.COlor:=couleur; - Pen.Mode:=PmCopy; - 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 - - - r:=Rect(x0,jy1,x0+LargeurCell,jy2); + Brush.Color:=Fond; + r:=Rect(x0,y0,x0+LargeurCell,y0+HauteurCell); FillRect(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; - Polygon([point(x1,y1),Point(x2,y2),Point(x3,y3),Point(x4-1,y4-1)]); + x1:=x0+3; + y1:=y0; + x2:=x0+largeurCell; + y2:=y0+HauteurCell-3; + x3:=x0+largeurCell-4; + y3:=y0+HauteurCell; + x4:=x0; + y4:=y0+4; + Brush.Color:=couleur; + pen.color:=couleur; + + PolyGon([point(x1,y1),point(x2,y2),point(x3,y3),point(x4,y4)]); end; -end; +end; // courbe bas gauche vers droit -procedure TFormTCO.dessin_cbgd(x,y : integer;couleur : Tcolor); +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; begin x0:=(x-1)*LargeurCell; y0:=(y-1)*HauteurCell; - with ImageTCO.canvas do + with canvas do begin + Brush.Color:=Fond; + r:=Rect(x0,y0,x0+LargeurCell,y0+HauteurCell); + FillRect(r); + Brush.COlor:=Couleur; pen.color:=Couleur; - Pen.Mode:=PmCopy; - + 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+(largeurCell div 2),jy1,x0+LargeurCell,jy2); + r:=Rect(x0+(largeurCell div 2),jy1,x0+LargeurCell,jy2); FillRect(r); // brush.color:=clblue; @@ -203,22 +455,25 @@ begin x4:=x0+3; y4:=y0+HauteurCell; Polygon([point(x1-2,y1+2),Point(x2,y2),Point(x3,y3),Point(x4-2,y4+2)]); - end; end; // courbe: droit vers bas -\ -procedure TFormTCO.dessin_cdbas(x,y : integer;couleur : Tcolor); +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; begin x0:=(x-1)*LargeurCell; y0:=(y-1)*HauteurCell; - with ImageTCO.canvas do + with canvas do begin + Brush.Color:=Fond; + r:=Rect(x0,y0,x0+LargeurCell,y0+HauteurCell); + FillRect(r); + Brush.COlor:=Couleur; - Pen.Mode:=PmCopy; + Pen.Mode:=Mode; pen.color:=Couleur; jy1:=y0+(HauteurCell div 2)-3; // pos Y de la bande sup @@ -236,10 +491,239 @@ begin x4:=x0+(LargeurCell div 2); y4:=jy2; Polygon([point(x1,y1),Point(x2,y2),Point(x3,y3),Point(x4,y4)]); + end; +end; + + +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; +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); + + 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 + r:=Rect(x0,jy1,x0+(LargeurCell div 2),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)]); + end; +end; + +// coin supérieur gauche +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; +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); + + 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 + 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; + 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); +var x0,y0,x1,y1,x2,y2,x3,y3,x4,y4,jy1,jy2 : integer; + r : Trect; + s : string; +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); + + 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 + + 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)]); + end; +end; + + +// aiguillage pointe à droite, aiguillage droit +procedure TFormTCO.dessin_AigPD_AD(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; + s : string; +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); + + Brush.COlor:=couleur; + 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 + + 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)]); + end; +end; + +procedure TformTCO.dessin_AigG_PD(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; + s : string; +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); + + Brush.COlor:=couleur; + Pen.Mode:=Mode; + 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 + 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)]); + end; +end; + + +procedure TformTCO.dessin_AigD_PG(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; + s : string; +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); + + Brush.Color:=couleur; + Pen.Mode:=Mode; + 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 + 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)]); + end; end; +procedure TFormTCO.EffaceCellule(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; +begin + x0:=(x-1)*LargeurCell; + y0:=(y-1)*HauteurCell; + r:=Rect(x0,y0,x0+LargeurCell+1,y0+HauteurCell+1); + + with canvas do + begin + Pen.Mode:=mode; + Pen.color:=clLime; + Brush.Color:=Fond; + Brush.style:=bsSolid; + // rectangle(r); + fillRect(r); + end; +end; + // transforme les branches en TCO // à voir, trop compliqué. Il faudra dessiner son TCO soit meme procedure construit_TCO; @@ -247,7 +731,7 @@ var x,y,i,j,Max,indexMax : integer; begin // étape 0 Raz du TCO for y:=1 to 20 do - for x:=1 to 20 do + for x:=1 to 20 do begin TCO[x,y].Adresse:=0; TCO[x,y].Btype:=0; @@ -268,59 +752,95 @@ begin // stocker cette branche au milieu du TCO (en 5) for i:=1 to Max do begin - TCO[i,5].Adresse:=BrancheN[IndexMax,i].Adresse; + TCO[i,5].Adresse:=BrancheN[IndexMax,i].Adresse; TCO[i,5].Btype:=BrancheN[IndexMax,i].Btype; end; end; -procedure Affiche_TCO ; -var i,j,x,y,xOrg,Yorg,btype : integer; + +// affiche la cellule. x et y en cases +procedure TformTCO.affiche_cellule(x,y : integer;mode : TPenMode); +var Xorg,Yorg,i,btype,Bimage : integer; s : string; +begin + i:=tco[x,y].Adresse; + btype:=tco[x,y].Btype; + BImage:=tco[x,y].BImage; + Xorg:=(x-1)*LargeurCell; + Yorg:=(y-1)*HauteurCell; + s:=IntToSTR(i); + if Btype=2 then s:='A'+s; + if Btype=3 then s:='A'+s+'B'; + + case Bimage of + // ne pas passer la forme ds le paremètre canvas, çà ne s'afficherapas + 0 : effacecellule(ImageTCO.Canvas,x,y,Clyellow,Mode); + 1 : dessin_AigPD_AD(ImageTCO.Canvas,X,Y,Clyellow,Mode); + 2 : dessin_AigG_PD(ImageTCO.Canvas,X,Y,Clyellow,mode); + 3 : dessin_AigPG_AG(ImageTCO.Canvas,X,Y,Clyellow,mode); + 4 : dessin_AigD_PG(ImageTCO.Canvas,X,Y,Clyellow,Mode); + 5 : dessin_voie(ImageTCO.Canvas,X,Y,Clyellow,Mode); + 6 : dessin_SupG(ImageTCO.Canvas,X,Y,Clyellow,Mode); + 7 : dessin_SupD(ImageTCO.Canvas,X,Y,Clyellow,Mode); + 8 : dessin_infD(ImageTCO.Canvas,X,Y,Clyellow,Mode); + 9 : dessin_infG(ImageTCO.Canvas,X,Y,Clyellow,mode); + 10 : dessin_Diag1(ImageTCO.Canvas,X,Y,Clyellow,mode); + 11 : dessin_Diag2(ImageTCO.Canvas,X,Y,Clyellow,mode); + end; + if (BImage>=2) then + begin // Adresse de l'élément + ImageTCO.Canvas.Brush.Color:=fond; + ImageTCO.Canvas.Font.Color:=CouleurAdresse; + ImageTCO.Canvas.TextOut(xOrg+1,yOrg+1,s); + end; + if (BImage=1) then + begin // Adresse de l'élément + ImageTCO.Canvas.Brush.Color:=fond; + ImageTCO.Canvas.Font.Color:=CouleurAdresse; + ImageTCO.Canvas.TextOut(xOrg+1,yOrg+21,s); + end; +end; + +// affiche le tco suivant le tableau TCO +procedure TformTCO.Affiche_TCO ; +var x,y : integer; + s : string; + r : Trect; begin with formTCO.ImageTCO.Canvas do begin - Brush.color:=ClBlack; - font.color:=clWhite; + Brush.Style:=bsSolid; + Brush.Color:=fond; + pen.color:=clyellow; + r:=rect(1,1,NbreCellX*LargeurCell,NbreCelly*HauteurCell); + FillRect(r); end; - for y:=1 to 10 do - for x:=1 to 20 do + for y:=1 to NbreCellY do + for x:=1 to NbreCellX do begin - i:=tco[x,y].Adresse; - btype:=tco[x,y].Btype; - with formTCO.ImageTCO.Canvas do - begin - Xorg:=(x-1)*LargeurCell; - Yorg:=(y-1)*HauteurCell; - - s:=IntToSTR(i); - if Btype=2 then s:='A'+s; - if Btype=3 then s:='A'+s+'B'; - - if i<>0 then Textout(Xorg+2,Yorg+2,s); - end; - end; + affiche_cellule(x,y,PmCopy); + end; + grille; end; procedure TFormTCO.FormCreate(Sender: TObject); begin caption:='TCO'; - NbreCellX:=20; - NbreCellY:=10; LargeurCell:=35; HauteurCell:=35; + XclicCell:=1; YclicCell:=1; - KeyPreview:=true; // valide les évènements clavier - // grille; - // Entoure_cell(XclicCell,YclicCell); + KeyPreview:=false; // invalide les évènements clavier + fond:=$202050; + couleurAdresse:=Cyan; + xMiniSel:=999;yMiniSel:=999; + xMaxiSel:=0;yMaxiSel:=0; + SelectionAffichee:=false; end; -procedure TFormTCO.Button1Click(Sender: TObject); -begin - repaint; -end; // clic gauche sur image procedure TFormTCO.ImageTCOClick(Sender: TObject); @@ -328,23 +848,34 @@ var Position: TPoint; begin Entoure_cell(XclicCell,YclicCell); GetCursorPos(Position); - + Position:=ImageTCO.screenToCLient(Position); Xclic:=position.X;YClic:=position.Y; XclicCell:=Xclic div largeurCell +1; YclicCell:=Yclic div hauteurCell +1; + if XclicCell>NbreCellX then exit; + if YclicCell>NbreCellY then exit; + + LabelX.caption:=IntToSTR(XclicCell); LabelY.caption:=IntToSTR(YclicCell); - label1.caption:='clicContext'; XclicCellInserer:=XClicCell; YclicCellInserer:=YClicCell; Entoure_cell(XclicCellInserer,YclicCellInserer); + + EditAdrElement.Text:=IntToSTR(tco[XClicCellInserer,YClicCellInserer].Adresse); + EdittypeElement.Text:=IntToSTR(tco[XClicCellInserer,YClicCellInserer].BType); + EdittypeImage.Text:=IntToSTR(tco[XClicCellInserer,YClicCellInserer].BImage); + + //Affiche('XClicCell='+intToSTR(XclicCell)+' '+'YClicCell='+intToSTR(YclicCell),clyellow); + //Affiche('Evt ImageTCOclick',clYellow); end; procedure TformTCO.Entoure_cell(x,y : integer); var r : Trect; x0,y0 : integer; begin + exit; x0:=(x-1)*LargeurCell+1; y0:=(y-1)*HauteurCell+1; with ImageTCO.canvas do @@ -367,19 +898,22 @@ begin if not(Forminit) then begin FormInit:=true; - grille; - Entoure_cell(XclicCell,YclicCell); - end; - { - dessin_voie(3,3); - dessin_voie(10,4); - dessin_AigPG_AG(7,6,clyellow); - dessin_AigPD_AD(12,6,clyellow); + // 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); + lire_fichier_tco; + Affiche_tco; + end; - dessin_cbgd(8,5,clyellow); - dessin_voie(9,5);dessin_voie(10,5); - dessin_cdbas(11,5,clyellow); } - //formprinc.Hide; end; // evt qui se produit quand on clic droit dans l'image @@ -389,52 +923,90 @@ begin // efface le carré pointeur Entoure_cell(XclicCell,YclicCell); GetCursorPos(Position); - + Position:=ImageTCO.screenToCLient(Position); Xclic:=position.X;YClic:=position.Y; XclicCell:=Xclic div largeurCell +1; YclicCell:=Yclic div hauteurCell +1; - LabelX.caption:=IntToSTR(XclicCell); + LabelX.caption:=IntToSTR(XclicCell); LabelY.caption:=IntToSTR(YclicCell); label1.caption:='clicContext'; XclicCellInserer:=XClicCell; YclicCellInserer:=YClicCell; Entoure_cell(XclicCellInserer,YclicCellInserer); + + //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 + // effacer le carré pointeur Entoure_cell(XclicCell,YclicCell); - GetCursorPos(Position); // dessine le dessin - dessin_AigPG_AG(XClicCellInserer,YClicCellInserer,clyellow); + dessin_AigPG_AG(ImageTCO.canvas,XClicCellInserer,YClicCellInserer,clyellow,pmCopy); // remet le carré pointeur Entoure_cell(XclicCell,YclicCell); - GetCursorPos(Position); + + 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 + // effacer le carré pointeur Entoure_cell(XclicCell,YclicCell); - GetCursorPos(Position); // dessine le dessin - dessin_AigPD_AD(XClicCellInserer,YClicCellInserer,clyellow); + dessin_AigPD_AD(ImageTCO.Canvas,XClicCellInserer,YClicCellInserer,clyellow,pmCopy); // remet le carré pointeur Entoure_cell(XclicCell,YclicCell); - GetCursorPos(Position); + + EditAdrElement.Text:=IntToSTR(tco[XClicCellInserer,YClicCellInserer].Adresse); + EdittypeElement.Text:=IntToSTR(tco[XClicCellInserer,YClicCellInserer].BType); + end; +procedure TFormTCO.Aiguillagegauchepointedroite1Click(Sender: TObject); +var Position: TPoint; +begin + // effacer le carré pointeur + Entoure_cell(XclicCell,YclicCell); + // dessine le dessin + dessin_AigG_PD(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.Aiguillagedroitpointegauche1Click(Sender: TObject); +var Position: TPoint; +begin + tco[XClicCellInserer,YClicCellInserer].Adresse:=1; + tco[XClicCellInserer,YClicCellInserer].Btype:=1; + // effacer le carré pointeur + Entoure_cell(XclicCell,YclicCell); + // dessine le dessin + dessin_AigD_PG(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.FormKeyDown(Sender: TObject; var Key: Word;Shift: TShiftState); begin - Entoure_cell(XclicCell,YclicCell); + exit; + Entoure_cell(XclicCell,YclicCell); case Key of VK_right : if XClicCell1 then dec(XClicCell); @@ -444,6 +1016,574 @@ begin LabelX.caption:=IntToSTR(XClicCell); LabelY.caption:=IntToSTR(YClicCell); Entoure_cell(XclicCell,YclicCell); + EditAdrElement.Text:=IntToSTR(tco[XClicCell,YClicCell].Adresse); + EdittypeElement.Text:=IntToSTR(tco[XClicCell,YClicCell].BType); + +end; + +procedure TFormTCO.Elmentdroit1Click(Sender: TObject); +var Position: TPoint; +begin + // effacer le carré pointeur + Entoure_cell(XclicCell,YclicCell); + // dessine le dessin + dessin_voie(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.Courbegaucheversdroite1Click(Sender: TObject); +var Position: TPoint; +begin + // effacer le carré pointeur + Entoure_cell(XclicCell,YclicCell); + // dessine le dessin + dessin_infG(ImageTCO.canvas,XClicCellInserer,YClicCellInserer,clyellow,pmCopy); + // remet le carré pointeur + Entoure_cell(XclicCell,YclicCell); + GetCursorPos(Position); +end; + +procedure TFormTCO.Courbedroiteversgauche1Click(Sender: TObject); +var Position: TPoint; +begin + // effacer le carré pointeur + Entoure_cell(XclicCell,YclicCell); + // dessine le dessin + dessin_infD(ImageTCO.canvas,XClicCellInserer,YClicCellInserer,clyellow,pmCopy); + // remet le carré pointeur + Entoure_cell(XclicCell,YclicCell); + GetCursorPos(Position); +end; + + +procedure TFormTCO.CourbeSupD1Click(Sender: TObject); +var Position: TPoint; +begin + // effacer le carré pointeur + Entoure_cell(XclicCell,YclicCell); + // dessine le dessin + dessin_SupD(ImageTCO.canvas,XClicCellInserer,YClicCellInserer,clyellow,pmCopy); + // remet le carré pointeur + Entoure_cell(XclicCell,YclicCell); + GetCursorPos(Position); +end; + +procedure TFormTCO.CourbeSupG1Click(Sender: TObject); +var Position: TPoint; +begin + // effacer le carré pointeur + Entoure_cell(XclicCell,YclicCell); + // dessine le dessin + dessin_SupG(ImageTCO.canvas,XClicCellInserer,YClicCellInserer,clyellow,pmCopy); + // remet le carré pointeur + Entoure_cell(XclicCell,YclicCell); + GetCursorPos(Position); + +end; + +procedure TFormTCO.ImageTCODragOver(Sender, Source: TObject; X, Y: Integer; + State: TDragState; var Accept: Boolean); +begin + Accept:=source is TImage; +end; + + + +procedure TFormTCO.FormDockOver(Sender: TObject; Source: TDragDockObject; + X, Y: Integer; State: TDragState; var Accept: Boolean); +begin + accept:=true; +end; + +procedure TFormTCO.ImagePalette1MouseDown(Sender: TObject; + Button: TMouseButton; Shift: TShiftState; X, Y: Integer); +begin + ImagePalette1.BeginDrag(true); +end; + +procedure TFormTCO.ImagePalette1EndDrag(Sender, Target: TObject; X, + Y: Integer); +begin + if (x=0) and (y=0) then exit; + Xclic:=X;YClic:=Y; + XclicCell:=Xclic div largeurCell +1; + YclicCell:=Yclic div hauteurCell +1; + dessin_AigPD_AD(ImageTCO.Canvas,XClicCell,YClicCell,Clyellow,pmCopy); + tco[XClicCell,YClicCell].BType:=2; // aiguillage + tco[XClicCell,YClicCell].BImage:=1; // image 1 + + 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); +begin + if (x=0) and (y=0) then exit; + Xclic:=X;YClic:=Y; + XclicCell:=Xclic div largeurCell +1; + YclicCell:=Yclic div hauteurCell +1; + dessin_AigG_PD(ImageTCO.Canvas,XClicCell,YClicCell,Clyellow,pmCopy); + tco[XClicCell,YClicCell].BType:=2; // aiguillage + tco[XClicCell,YClicCell].BImage:=2; // image 2 + + EditAdrElement.Text:=IntToSTR( tco[XClicCell,YClicCell].Adresse); + EdittypeElement.Text:=IntToSTR( tco[XClicCell,YClicCell].Btype); + EdittypeImage.Text:=IntToSTR(tco[XClicCell,YClicCell].BImage); +end; + +procedure TFormTCO.ImagePalette2MouseDown(Sender: TObject; + Button: TMouseButton; Shift: TShiftState; X, Y: Integer); +begin + ImagePalette2.BeginDrag(true); +end; + +procedure TFormTCO.ImagePalette3EndDrag(Sender, Target: TObject; X,Y: Integer); +begin + if (x=0) and (y=0) then exit; + Xclic:=X;YClic:=Y; + XclicCell:=Xclic div largeurCell +1; + YclicCell:=Yclic div hauteurCell +1; + dessin_AigPG_AG(ImageTCO.Canvas,XClicCell,YClicCell,Clyellow,pmCopy); + tco[XClicCell,YClicCell].BType:=2; // aiguillage + tco[XClicCell,YClicCell].BImage:=3; // image 3 + + EditAdrElement.Text:=IntToSTR( tco[XClicCell,YClicCell].Adresse); + EdittypeElement.Text:=IntToSTR( tco[XClicCell,YClicCell].Btype); + EdittypeImage.Text:=IntToSTR(tco[XClicCell,YClicCell].BImage); +end; + +procedure TFormTCO.ImagePalette3MouseDown(Sender: TObject; + Button: TMouseButton; Shift: TShiftState; X, Y: Integer); +begin + ImagePalette3.BeginDrag(true); +end; + +procedure TFormTCO.ImagePalette4EndDrag(Sender, Target: TObject; X,Y: Integer); +begin + if (x=0) and (y=0) then exit; + Xclic:=X;YClic:=Y; + XclicCell:=Xclic div largeurCell +1; + YclicCell:=Yclic div hauteurCell +1; + dessin_AigD_PG(ImageTCO.Canvas,XClicCell,YClicCell,Clyellow,pmCopy); + tco[XClicCell,YClicCell].BType:=2; // aiguillage + tco[XClicCell,YClicCell].BImage:=4; // image 4 + + EditAdrElement.Text:=IntToSTR( tco[XClicCell,YClicCell].Adresse); + EdittypeElement.Text:=IntToSTR( tco[XClicCell,YClicCell].Btype); + EdittypeImage.Text:=IntToSTR(tco[XClicCell,YClicCell].BImage); +end; + +procedure TFormTCO.ImagePalette4MouseDown(Sender: TObject; + Button: TMouseButton; Shift: TShiftState; X, Y: Integer); +begin + ImagePalette4.BeginDrag(true); +end; + +procedure TFormTCO.ImagePaletteDroitEndDrag(Sender, Target: TObject; X, + Y: Integer); +begin + if (x=0) and (y=0) then exit; + 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].Adresse:=0; + + EditAdrElement.Text:=IntToSTR( tco[XClicCell,YClicCell].Adresse); + EdittypeElement.Text:=IntToSTR( tco[XClicCell,YClicCell].Btype); + EdittypeImage.Text:=IntToSTR(tco[XClicCell,YClicCell].BImage); +end; + +procedure TFormTCO.ImagePaletteDroitMouseDown(Sender: TObject; + Button: TMouseButton; Shift: TShiftState; X, Y: Integer); +begin + ImagePaletteDroit.BeginDrag(true); +end; + +procedure TFormTCO.ImageSupGEndDrag(Sender, Target: TObject; X,Y: Integer); +begin + if (x=0) and (y=0) then exit; + Xclic:=X;YClic:=Y; + XclicCell:=Xclic div largeurCell +1; + YclicCell:=Yclic div hauteurCell +1; + dessin_SupG(ImageTCO.Canvas,XClicCell,YClicCell,Clyellow,pmCopy); + tco[XClicCell,YClicCell].BType:=0; // rien + tco[XClicCell,YClicCell].BImage:=6; // image 6 + tco[XClicCell,YClicCell].Adresse:=0; + + EditAdrElement.Text:=IntToSTR( tco[XClicCell,YClicCell].Adresse); + EdittypeElement.Text:=IntToSTR( tco[XClicCell,YClicCell].Btype); + EdittypeImage.Text:=IntToSTR(tco[XClicCell,YClicCell].BImage); +end; + +procedure TFormTCO.ImageSupGMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); +begin + ImageSupG.BeginDrag(true); +end; + +procedure TFormTCO.ImageSupDEndDrag(Sender, Target: TObject; X, + Y: Integer); +begin + if (x=0) and (y=0) then exit; + Xclic:=X;YClic:=Y; + XclicCell:=Xclic div largeurCell +1; + YclicCell:=Yclic div hauteurCell +1; + dessin_SupD(ImageTCO.Canvas,XClicCell,YClicCell,Clyellow,pmCopy); + tco[XClicCell,YClicCell].BType:=0; // rien + tco[XClicCell,YClicCell].BImage:=7; // image 7 + tco[XClicCell,YClicCell].Adresse:=0; + + EditAdrElement.Text:=IntToSTR( tco[XClicCell,YClicCell].Adresse); + EdittypeElement.Text:=IntToSTR( tco[XClicCell,YClicCell].Btype); + EdittypeImage.Text:=IntToSTR(tco[XClicCell,YClicCell].BImage); +end; + +procedure TFormTCO.ImageSupDMouseDown(Sender: TObject; + Button: TMouseButton; Shift: TShiftState; X, Y: Integer); +begin + ImageSupD.BeginDrag(true); +end; + +procedure TFormTCO.ImageInfDEndDrag(Sender, Target: TObject; X, + Y: Integer); +begin + if (x=0) and (y=0) then exit; + Xclic:=X;YClic:=Y; + XclicCell:=Xclic div largeurCell +1; + YclicCell:=Yclic div hauteurCell +1; + dessin_infD(ImageTCO.Canvas,XClicCell,YClicCell,Clyellow,pmCopy); + tco[XClicCell,YClicCell].BType:=0; // rien + tco[XClicCell,YClicCell].BImage:=8; // image 8 + tco[XClicCell,YClicCell].Adresse:=0; + + EditAdrElement.Text:=IntToSTR( tco[XClicCell,YClicCell].Adresse); + EdittypeElement.Text:=IntToSTR( tco[XClicCell,YClicCell].Btype); + EdittypeImage.Text:=IntToSTR(tco[XClicCell,YClicCell].BImage); +end; + +procedure TFormTCO.ImageInfDMouseDown(Sender: TObject; + Button: TMouseButton; Shift: TShiftState; X, Y: Integer); +begin + ImageInfD.BeginDrag(true); +end; + +procedure TFormTCO.ImageInfGMouseDown(Sender: TObject; + Button: TMouseButton; Shift: TShiftState; X, Y: Integer); +begin + ImageInfG.BeginDrag(true); +end; + +procedure TFormTCO.ImageInfGEndDrag(Sender, Target: TObject; X, + Y: Integer); +begin + if (x=0) and (y=0) then exit; + Xclic:=X;YClic:=Y; + XclicCell:=Xclic div largeurCell +1; + YclicCell:=Yclic div hauteurCell +1; + dessin_infG(ImageTCO.Canvas,XClicCell,YClicCell,Clyellow,pmCopy); + tco[XClicCell,YClicCell].BType:=0; // rien + tco[XClicCell,YClicCell].BImage:=9; // image 9 + 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; +var x,y : integer; +begin + if SelectionAffichee then + begin + TamponTCO_Org.x1:=XminiSel div LargeurCell +1; + 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]; + TamponAffecte:=true; + end; + +end; + +// supprimer la sélection +procedure TFormTCO.MenuCouperClick(Sender: TObject); +var Position: TPoint; + r : Trect; + x0,y0,x,y,XCell1,YCell1,xCell2,yCell2 : integer; +begin + if not(SelectionAffichee) then exit; + + copier; + + SelectionAffichee:=false; + + xCell1:=XminiSel div LargeurCell +1; + xCell2:=XmaxiSel div LargeurCell +1; + yCell1:=yminiSel div LargeurCell +1; + yCell2:=ymaxiSel div LargeurCell +1; + + for y:=yCell1 to yCell2 do + for x:=xCell1 to xCell2 do + begin + tco[x,y].BType:=0; + tco[x,y].Adresse:=0; + tco[x,y].BImage:=0; + effacecellule(ImageTCO.Canvas,X,Y,Clyellow,PmCopy); + end; + +end; + +procedure TFormTCO.ImageTCOMouseDown(Sender: TObject; Button: TMouseButton; + Shift: TShiftState; X, Y: Integer); +begin + if button=mbLeft then + begin + xMiniSel:=999;yMiniSel:=999; + xMaxiSel:=0;yMaxiSel:=0; + sourisclic:=true; + + if SelectionAffichee then + begin + with imageTCO.Canvas do + begin + Pen.Mode:=PmXor; + Pen.color:=clGrille; + Brush.Color:=clblue; + //FillRect(r); + Rectangle(rAncien); + end; + SelectionAffichee:=false; + end; + + end; + + +end; + +procedure TFormTCO.ImageTCOMouseMove(Sender: TObject; Shift: TShiftState;X, Y: Integer); +var Position: TPoint; + r : Trect; + x0,y0,XSel1,YSel1,XSel2,YSel2 : integer; +begin + //Affiche('MouseMove',clyellow); + if not(sourisclic) then exit; + //Affiche('MouseMove',clyellow); + GetCursorPos(Position); + Position:=ImageTCO.screenToCLient(Position); + Xclic:=position.X; + YClic:=position.Y; + + // coordonnées grilleg + XclicCell:=Xclic div largeurCell + 1; + YclicCell:=Yclic div hauteurCell + 1; + + if XclicCell>NbreCellX then exit; + if YclicCell>NbreCellY then exit; + + //Affiche('X='+IntToSTR(XClicCell)+' Y='+intToSTR(YclicCell),clyellow); + + x0:=(XclicCell-1)*LargeurCell; + y0:=(YclicCell-1)*HauteurCell; + //Affiche('X0='+IntToSTR(x0)+' Y0='+intToSTR(y0),clyellow); + + AncienXMiniSel:=xMiniSel; + AncienYMiniSel:=YminiSel; + AncienXmaxiSel:=XmaxiSel; + AncienYMaxiSel:=YmaxiSel; + + if xMiniSel>x0 then XminiSel:=X0; + if yMiniSel>y0 then yminiSel:=y0; + if xMaxiSel0) or (Adr<0) or (Adr>2048) then + begin + EditAdrElement.text:=intToSTR(tco[XClicCell,YClicCell].Adresse); + exit; + end; + tco[XClicCell,YClicCell].Adresse:=Adr; + affiche_cellule(XClicCell,YClicCell,pmCopy); +end; + + +procedure TFormTCO.EditTypeImageKeyPress(Sender: TObject; var Key: Char); +var Bimage,erreur : integer; +begin + if ord(Key) = VK_RETURN then + begin + Key := #0; // prevent beeping + Val(EditTypeImage.Text,Bimage,erreur); + Affiche(IntToSTR(bimage),clyellow); + if (erreur<>0) or (Bimage<0) or (Bimage>9) then + begin + EditTypeElement.text:=intToSTR(tco[XClicCell,YClicCell].Btype); + exit; + end; + tco[XClicCell,YClicCell].Bimage:=Bimage; + affiche_cellule(XClicCell,YClicCell,pmCopy); + end; +end; + +procedure TFormTCO.Maj_TCO(Adresse : integer;etat : boolean); +var x,y : integer; +begin + for y:=1 to NbreCellY do + for x:=1 to NbreCellX do + begin + if tco[x,y].Adresse=Adresse then + affiche_cellule(x,y,PmCopy); + end; +end; + +procedure TFormTCO.Button1Click(Sender: TObject); +begin + Detecteur[513]:=true; + Maj_tco(513,true); +end; + +procedure TFormTCO.Button2Click(Sender: TObject); +begin + Detecteur[513]:=false; + Maj_tco(513,false); +end; + + + +procedure TFormTCO.ImageDiag1EndDrag(Sender, Target: TObject; X, Y: Integer); +begin + if (x=0) and (y=0) then exit; + Xclic:=X;YClic:=Y; + XclicCell:=Xclic div largeurCell +1; + YclicCell:=Yclic div hauteurCell +1; + dessin_Diag1(ImageTCO.Canvas,XClicCell,YClicCell,Clyellow,pmCopy); + tco[XClicCell,YClicCell].BType:=0; // rien + tco[XClicCell,YClicCell].BImage:=10; // image 10 + tco[XClicCell,YClicCell].Adresse:=0; + + EditAdrElement.Text:=IntToSTR( tco[XClicCell,YClicCell].Adresse); + EdittypeElement.Text:=IntToSTR( tco[XClicCell,YClicCell].Btype); + EdittypeImage.Text:=IntToSTR(tco[XClicCell,YClicCell].BImage); +end; + +procedure TFormTCO.ImageDiag1MouseDown(Sender: TObject; + Button: TMouseButton; Shift: TShiftState; X, Y: Integer); +begin + ImageDiag1.BeginDrag(true); +end; + +procedure TFormTCO.ImageDiag2EndDrag(Sender, Target: TObject; X, + Y: Integer); +begin + if (x=0) and (y=0) then exit; + Xclic:=X;YClic:=Y; + XclicCell:=Xclic div largeurCell +1; + YclicCell:=Yclic div hauteurCell +1; + dessin_Diag2(ImageTCO.Canvas,XClicCell,YClicCell,Clyellow,pmCopy); + tco[XClicCell,YClicCell].BType:=0; // rien + tco[XClicCell,YClicCell].BImage:=11; + tco[XClicCell,YClicCell].Adresse:=0; + + EditAdrElement.Text:=IntToSTR( tco[XClicCell,YClicCell].Adresse); + EdittypeElement.Text:=IntToSTR( tco[XClicCell,YClicCell].Btype); + EdittypeImage.Text:=IntToSTR(tco[XClicCell,YClicCell].BImage); +end; + +procedure TFormTCO.ImageDiag2MouseDown(Sender: TObject; + Button: TMouseButton; Shift: TShiftState; X, Y: Integer); +begin + ImageDiag2.BeginDrag(true); end; end. diff --git a/configcapde.cfg b/configcapde.cfg deleted file mode 100644 index 15fd99f..0000000 --- a/configcapde.cfg +++ /dev/null @@ -1,112 +0,0 @@ -/****************************************** -/ 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 -/ 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[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 -/ 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,P2P,D3P,S1BS -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 -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,S0 -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,P28S,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 description n'a pas d'importance. -/ Chaque ligne (branche) doit comporter au moins un détecteur et au moins aiguillage -/ @ détecteur A=@aiguillage -/ 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 -/ -/ 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 -0 -/ -/ 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 (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, 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,(561,547),0 -217,2,0,4,(514,A26,515,A26),0 -225,9,0,4,(516,A29),0 -233,4,0,4,(547,A20),0 -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 -0 diff --git a/tco.cfg b/tco.cfg new file mode 100644 index 0000000..0333397 --- /dev/null +++ b/tco.cfg @@ -0,0 +1,12 @@ +/type(0=rien 1=voie/détecteur 2=aig 3=aigBis , adresse , image=1 à 10 +/Dalle TCO +(2,123,1)(2,100,1)(1,513,5)(0,000,0)(0,000,0)(0,000,0)(0,000,0)(0,000,0)(0,000,0)(0,000,0)(0,000,0)(0,000,0)(0,000,0)(0,000,0)(0,000,0)(0,000,0)(0,000,0)(0,000,0)(0,000,0)(0,000,0) +(2,124,2)(0,000,0)(0,000,0)(0,000,0)(0,000,0)(0,000,0)(0,000,0)(0,000,0)(0,000,0)(0,000,0)(0,000,0)(0,000,0)(0,000,0)(0,000,0)(0,000,0)(0,000,0)(0,000,0)(0,000,0)(0,000,0)(0,000,0) +(0,000,0)(0,000,0)(0,000,0)(0,000,0)(0,000,0)(0,000,0)(0,000,0)(0,000,0)(0,000,8)(0,000,0)(0,000,0)(0,000,0)(0,000,0)(0,000,0)(0,000,0)(0,000,0)(0,000,0)(0,000,0)(0,000,0)(0,000,0) +(0,000,0)(0,000,0)(0,000,0)(0,000,0)(0,000,0)(0,000,0)(0,000,0)(0,000,9)(1,000,5)(2,000,1)(1,000,5)(0,000,8)(0,000,0)(0,000,0)(0,000,0)(0,000,0)(0,000,0)(0,000,0)(0,000,0)(0,000,0) +(2,007,0)(1,520,0)(2,020,0)(2,021,0)(2,028,0)(2,026,0)(0,000,10)(2,027,0)(2,025,0)(2,031,0)(1,534,0)(2,023,0)(0,000,11)(0,000,0)(0,000,0)(0,000,0)(0,000,0)(0,000,0)(0,000,0)(0,000,0) +(0,000,0)(0,000,0)(0,000,0)(0,000,0)(1,000,5)(2,000,3)(1,000,5)(1,000,5)(1,000,5)(1,000,5)(1,000,5)(1,000,5)(1,000,5)(2,000,1)(1,000,5)(0,000,0)(0,000,0)(0,000,0)(0,000,0)(0,000,0) +(0,000,0)(0,000,0)(0,000,0)(0,000,0)(0,000,0)(0,000,0)(0,000,0)(0,000,0)(0,000,0)(0,000,0)(0,000,0)(0,000,0)(0,000,0)(0,000,0)(0,000,0)(0,000,0)(0,000,0)(0,000,0)(0,000,0)(0,000,0) +(0,000,0)(0,000,0)(0,000,0)(0,000,0)(0,000,0)(0,000,0)(0,000,0)(0,000,0)(0,000,0)(0,000,0)(0,000,0)(0,000,0)(0,000,0)(0,000,0)(0,000,0)(0,000,0)(0,000,0)(0,000,0)(0,000,0)(0,000,0) +(0,000,0)(0,000,0)(0,000,0)(0,000,0)(0,000,0)(0,000,0)(0,000,0)(0,000,0)(0,000,0)(0,000,0)(0,000,0)(0,000,0)(0,000,0)(0,000,0)(0,000,0)(0,000,0)(0,000,0)(0,000,0)(0,000,0)(0,000,0) +(0,000,0)(0,000,0)(0,000,0)(0,000,0)(0,000,0)(0,000,0)(0,000,0)(0,000,0)(0,000,0)(0,000,0)(0,000,0)(0,000,0)(0,000,0)(0,000,0)(0,000,0)(0,000,0)(0,000,0)(0,000,0)(0,000,0)(0,000,0) diff --git a/verif_version.dcu b/verif_version.dcu index ce95b777986cc67a7707458398413a2523233bad..bdccaf40f06d8d3d64bc7337a46722be66583438 100644 GIT binary patch delta 86 zcmZp0Z*b?n&%nUnpv=JVvo~`hw=DCI-pq~KFBBNrCW|PRGdfQ0QPdLPW&X;<#>5~s mm6?H!MNUR_@-fAGqP)yAnHiWE80LaVRpx~t%69TjrQ-k>_!ZFr delta 86 zcmZp0Z*b?n&%nUnpv=H