V8.24
This commit is contained in:
@@ -169,7 +169,7 @@ var Segment : array of Tsegment;
|
||||
reducX,reducY,ArcTanHautLargTrain : double;
|
||||
FormAnalyseCDM: TFormAnalyseCDM;
|
||||
sBranche,NomModuleCDM : string;
|
||||
debugBranche,debugAnalyse,clic,premaff : boolean;
|
||||
clic,premaff : boolean;
|
||||
Aig_CDM : array[0..NbreMaxiAiguillages] of TAig_CDM;
|
||||
Det_CDM : array[1..500] of integer;
|
||||
FWICImage : tBitmap;
|
||||
@@ -377,8 +377,8 @@ begin
|
||||
s2:=isole_valeur(s,'connect status:');
|
||||
Segment[nSeg-1].port[nPort-1].connecte:=s2='connected';
|
||||
|
||||
if Segment[nSeg-1].port[nPort-1].typ='dummy_port' then
|
||||
exit;
|
||||
if Segment[nSeg-1].port[nPort-1].typ='dummy_port' then exit;
|
||||
if not(Segment[nSeg-1].port[nPort-1].connecte) then exit;
|
||||
|
||||
inc(nligne);
|
||||
s:=AnsiLowerCase(lignes[nligne]);
|
||||
@@ -831,9 +831,11 @@ end;
|
||||
// s*l = distance du point au segment
|
||||
function point_Sur_Segment(x,y,x1,y1,x2,y2 : integer): Boolean;
|
||||
var l,r,s : Double;
|
||||
p : integer;
|
||||
begin
|
||||
Result:=False;
|
||||
l:=sqrt(((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1)));
|
||||
p:=((x2-x1)*(x2-x1))+((y2-y1)*(y2-y1));
|
||||
l:=sqrt(p);
|
||||
if l<>0 then
|
||||
begin
|
||||
r:=((y1-y)*(y1-y2)-(x1-x)*(x2-x1))/(l*l);
|
||||
@@ -1990,7 +1992,7 @@ end;
|
||||
end;
|
||||
|
||||
|
||||
// fonction récursive
|
||||
// fonction récursive
|
||||
// explore le port,segment jusqu'a trouver une adresse d'aiguillage, de croisement, ou de détecteur
|
||||
// renvoie l'adresse de l'aiguillage ou du détecteur et dans C le port (P D S ou Z pour un détecteur)
|
||||
function explore_port(seg,port : integer;var c : string) : integer;
|
||||
@@ -2201,8 +2203,9 @@ begin
|
||||
for j:=0 to segment[i].nport-1 do
|
||||
begin
|
||||
s:=' Port '+intToSTR(j)+' ';
|
||||
// explorer les ports de l'aiguillage
|
||||
element:=explore_port(numsegment,segment[i].port[j].numero,c);
|
||||
element:=explore_port(numsegment,segment[i].port[j].numero,c);
|
||||
if length(c)=0 then c:='Z';
|
||||
|
||||
case j of // j=numéro de port
|
||||
0 : begin s:=s+'D';Aig_cdm[nAig_cdm].ddroit:=element;if length(c)<>0 then Aig_cdm[nAig_cdm].ddroitB:=c[1];end;
|
||||
@@ -2315,6 +2318,8 @@ begin
|
||||
3 : s:=s+'S2';
|
||||
end;
|
||||
|
||||
// explorer les ports de l'aiguillage
|
||||
element:=explore_port(numsegment,segment[i].port[j].numero,c);
|
||||
if length(c)=0 then c:='Z';
|
||||
|
||||
s:=s+' Element : '+intToStr(element)+c;
|
||||
@@ -2364,6 +2369,7 @@ begin
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
if nAig_CDM=0 then affiche('Aucun aiguillage avec adresse',clyellow);
|
||||
end;
|
||||
@@ -2479,6 +2485,13 @@ begin
|
||||
//afficheDebug('Port non connecté',clOrange);
|
||||
result:=false;
|
||||
end;
|
||||
end;
|
||||
|
||||
// vérifier si un détecteur est dans le champ d'une ligne
|
||||
// exemple s='A21,533,568,566' det=533 résultat vrai
|
||||
function presence_detecteur(s : string;det : integer) : boolean;
|
||||
begin
|
||||
result:=pos(','+intToSTR(det),s)<>0;
|
||||
end;
|
||||
|
||||
|
||||
@@ -2506,13 +2519,14 @@ end;
|
||||
exit;
|
||||
end;
|
||||
|
||||
|
||||
|
||||
// créée la branche depuis un aiguillage dont un des ports est un détecteur
|
||||
// indexSeg,port : index du segment et port de départ
|
||||
// AdrAig : adresse de l'aiguillage qui a servi de départ
|
||||
// AdrAig : adresse de l'aiguillage qui a servi de départ
|
||||
// et remplit la branche (sBranche)
|
||||
procedure cree_branche_aig(indexSeg,Indexport,adrAig,NbreMaxiAigRencontres : integer);
|
||||
var i,j,k,l,naig,IndexportSuivant,indexSegSuivant,NombrePeriph,
|
||||
detecteur,indexElBranche,AdrAigRencontre,numSegment,
|
||||
detecteur,indexElBranche,AdrAigRencontre,numSegment,
|
||||
rien,erreur,det2,nb_det,xp,yp,xd,yd,Adr2,AdrDer,idx : integer;
|
||||
trouve,doublon : boolean;
|
||||
s,ss,ctype,derch: string;
|
||||
@@ -2548,7 +2562,7 @@ begin
|
||||
|
||||
// est-ce un aiguillage
|
||||
if segment_aig(ctype) then
|
||||
begin
|
||||
begin
|
||||
AdrAigRencontre:=segment[indexSegSuivant].adresse;
|
||||
if debugBranche then Affichedebug('Aiguillage '+intTostr(adrAigRencontre),clyellow);
|
||||
if (ctype='dbl_slip_switch') and (segment[indexSegSuivant].adresse2<>0) then
|
||||
@@ -2557,7 +2571,6 @@ begin
|
||||
adr2:=segment[indexSegSuivant].adresse2;
|
||||
|
||||
derch:=dernier_champ(sBranche);
|
||||
if derch[1]='A' then begin derch:=copy(derch,2,length(derch)-1);end;
|
||||
if derch[1]='A' then begin derch:=copy(derch,2,length(derch)-1);end;
|
||||
val(derch,AdrDer,erreur);
|
||||
|
||||
@@ -2570,7 +2583,9 @@ begin
|
||||
idx:=index_aig(Adr2);
|
||||
if (aiguillage[idx].ADroit=AdrDer) or (aiguillage[idx].ADevie=AdrDer) then
|
||||
sbranche:=sbranche+',A'+intToSTR(adr2)+',A'+intToSTR(AdrAigRencontre)
|
||||
else
|
||||
else
|
||||
begin
|
||||
s:='TJD '+intToSTR(Adr2)+'/'+intToSTR(adrAigRencontre)+'non résolue en branche '+intToSTR(nbreBranches)+'. Une vérification manuelle est nécessaire.';
|
||||
Affiche(s,clred);
|
||||
if debugBranche then AfficheDebug(s,clred);
|
||||
sbranche:=sbranche+',A??,A??';
|
||||
@@ -2591,7 +2606,7 @@ begin
|
||||
|
||||
// est-ce un croisement
|
||||
if ctype='crossing' then
|
||||
begin
|
||||
begin
|
||||
sBranche:=sBranche+',A'+intToSTR(segment[indexSegSuivant].adresse);
|
||||
if debugBranche then Affichedebug('croisement',clyellow);
|
||||
//if debugBranche then AfficheDebug('Croisement '+intToSTR(segment[indexSegSuivant].adresse),clorange);
|
||||
@@ -2630,7 +2645,7 @@ begin
|
||||
if segment[indexSegSuivant].periph[j].typ='detector' then
|
||||
begin
|
||||
detecteur:=segment[indexSegSuivant].periph[j].adresse;
|
||||
if detecteur<>0 then
|
||||
if detecteur<>0 then
|
||||
begin
|
||||
if debugBranche then Affichedebug('Détecteur '+inttoStr(detecteur),clyellow);
|
||||
// incrémenter le compteur du détecteur rencontré
|
||||
@@ -2647,25 +2662,39 @@ begin
|
||||
end;
|
||||
end;
|
||||
inc(j);
|
||||
until (j>NombrePeriph-1) ;
|
||||
|
||||
until (j>NombrePeriph-1) ;
|
||||
|
||||
if nb_det<>0 then
|
||||
begin
|
||||
// trier les détecteurs du segment dans l'ordre de la distance de la plus
|
||||
// courte à la plus grande au port
|
||||
trier(Sdetect,nb_det);
|
||||
|
||||
for j:=1 to nb_det do
|
||||
begin
|
||||
// vérifier si le détecteur est déja dans la branche
|
||||
begin
|
||||
// nouveau détecteur doublon
|
||||
detecteur:=sDetect[j].adresse;
|
||||
doublon:=presence_detecteur(sbranche,detecteur);
|
||||
if not(doublon) then
|
||||
begin
|
||||
sbranche:=sbranche+','+intToSTR(detecteur);
|
||||
if debugBranche then Affichedebug('Détecteur '+intToSTR(j)+'/'+intToSTR(nb_det)+': pris en compte : '+intToSTR(detecteur),clyellow);
|
||||
end
|
||||
else
|
||||
begin
|
||||
if debugBranche then Affichedebug('Détecteur '+intToSTR(j)+'/'+intToSTR(nb_det)+': non pris en compte : '+intToSTR(detecteur),clOrange);
|
||||
end;
|
||||
|
||||
{ ss:=dernier_champ(sbranche);
|
||||
k:=0;
|
||||
val(ss,k,erreur);
|
||||
if ss<>'' then if not(ss[1] in['0'..'9']) then k:=0;
|
||||
val(ss,k,erreur);
|
||||
if ss<>'' then if not(ss[1] in['0'..'9']) then k:=0;
|
||||
// vérifier si le détecteur est déja en fin de branche et que si on est au 2eme élément du tableau, on ne doit pas rencontrer le meme détecteur
|
||||
if k<>detecteur then
|
||||
begin
|
||||
sbranche:=sbranche+','+intToSTR(detecteur);
|
||||
if (k<>detecteur) then
|
||||
begin
|
||||
sbranche:=sbranche+','+intToSTR(detecteur);
|
||||
if debugBranche then Affichedebug('Détecteur '+intToSTR(j)+'/'+intToSTR(nb_det)+': pris en compte : '+intToSTR(detecteur),clyellow);
|
||||
end; }
|
||||
|
||||
inc(indexElBranche);
|
||||
@@ -2749,9 +2778,9 @@ begin
|
||||
if trouve then
|
||||
begin
|
||||
if debugBranche then
|
||||
begin
|
||||
AfficheDebug('La branche '+sBranche,clorange);
|
||||
begin
|
||||
AfficheDebug('La branche '+sBranche,clorange);
|
||||
AfficheDebug('est inutile car un de ses détecteurs '+intToSTR(detecteur)+' existe déjà dans la branche '+intToSTR(i-1),clOrange);
|
||||
end;
|
||||
exit;
|
||||
end;
|
||||
@@ -2772,7 +2801,6 @@ begin
|
||||
indexPort:=0; // essayer sur port 0 du détecteur
|
||||
fg:=false;
|
||||
essai_port:
|
||||
if debugBranche then
|
||||
if debugBranche then
|
||||
begin
|
||||
AfficheDebug('Créée branche détecteur '+intToSTR(detecteur)+' sur port '+intToSTR(indexPort),clOrange);
|
||||
@@ -2848,7 +2876,7 @@ var i,j,k,adresse,detecteur,indexSeg,det2,erreur : integer;
|
||||
procedure creee_branches;
|
||||
var i,j,k,adresse,detecteur,indexSeg,det2,erreur : integer;
|
||||
trouve : boolean;
|
||||
c : char;
|
||||
c : char;
|
||||
s : string;
|
||||
begin
|
||||
// l'origine d'une branche est la pointe d'un aiguillage connecté à un détecteur ----------
|
||||
@@ -2935,7 +2963,11 @@ begin
|
||||
if k<>0 then delete(s,1,k);
|
||||
until (k=0) or trouve;
|
||||
end;
|
||||
if not(trouve) then
|
||||
if not(trouve) then
|
||||
begin
|
||||
if debugBranche then
|
||||
begin
|
||||
AfficheDebug('------------------',clyellow);
|
||||
AfficheDebug('Le détecteur '+intToSTR(detecteur)+' est absent des branches, création d''une branche le contenant ',clOrange);
|
||||
end;
|
||||
cree_branche_det(detecteur);
|
||||
@@ -3050,7 +3082,7 @@ begin
|
||||
writeln(f,'');
|
||||
end;
|
||||
closefile(f);
|
||||
Affiche('Le fichier de segments CDM : '+NomModuleCDM+' a été créé',clYellow);
|
||||
Affiche('Le fichier de segments CDM : '+NomModuleCDM+' a été créé',clYellow);
|
||||
formprinc.Affiche_fenetre_CDM.enabled:=true;
|
||||
config_modifie:=true;
|
||||
end;
|
||||
@@ -3268,6 +3300,7 @@ end;
|
||||
|
||||
// importe la base de données CDM dans la base de données Signaux complexes
|
||||
// et crée les branches
|
||||
procedure Importation;
|
||||
var i : integer;
|
||||
s: string;
|
||||
begin
|
||||
@@ -3310,8 +3343,26 @@ begin
|
||||
aiguillage[i].InversionCDM:=0;
|
||||
aiguillage[i].vitesse:=0;
|
||||
end;
|
||||
MaxAiguillage:=NAig_CDM;
|
||||
trier_aig;
|
||||
// construit les index des aiguillages
|
||||
for i:=1 to maxAiguillage do
|
||||
begin
|
||||
index_accessoire[aiguillage[i].adresse]:=i;
|
||||
trier_aig;
|
||||
end;
|
||||
|
||||
// remplit la list box les aiguillages
|
||||
formconfig.ListBoxAig.Clear;
|
||||
for i:=1 to MaxAiguillage do
|
||||
begin
|
||||
s:=encode_aig(i);
|
||||
formconfig.ListBoxAig.Items.AddObject(s, Pointer(clRed));
|
||||
Aiguillage[i].modifie:=false;
|
||||
end;
|
||||
FormConfig.ListBoxAig.itemindex:=0;
|
||||
AncligneclicAig:=-1;
|
||||
ligneclicAig:=-1;
|
||||
|
||||
// créer les branches. Pour créer les branches, les aiguillages doivent être présents et leurs index construits
|
||||
NbreBranches:=0;
|
||||
creee_branches;
|
||||
@@ -3322,6 +3373,7 @@ begin
|
||||
compile_branche(Branche[i],i);
|
||||
|
||||
Affiche('Importation terminée',clWhite);
|
||||
Affiche('Vérification de la cohérence :',clWhite);
|
||||
if verif_coherence then Affiche('Configuration cohérente',clLime);
|
||||
if debugbranche or debugAnalyse then formDebug.Show;
|
||||
end;
|
||||
@@ -3351,8 +3403,14 @@ begin
|
||||
if not(faireImport) then exit;
|
||||
|
||||
ndet_cdm:=0;
|
||||
//debugAnalyse:=true;
|
||||
//debugBranche:=true;
|
||||
|
||||
//debugBranche:=true;
|
||||
if DebugAnalyse or DebugBranche then formDebug.RichDebug.Clear;
|
||||
Lignes:=Formprinc.FenRich.Lines;
|
||||
nligne:=0;
|
||||
nSeg:=0;
|
||||
nPort:=0;
|
||||
nPeriph:=0;
|
||||
nInter:=0;
|
||||
DernAdrAig:=0;
|
||||
@@ -3361,6 +3419,7 @@ begin
|
||||
NomModuleCDM:=AnsiLowerCase(Lignes[0]+'.cdm');
|
||||
formAnalyseCDM.Caption:='Squelette du réseau '+NomModuleCDM;
|
||||
formAnalyseCDM.Show;
|
||||
|
||||
Affiche('Compilation en cours',clWhite);
|
||||
// on compile: on crée la base de données
|
||||
if DebugBranche then AfficheDebug('Compilation des segments, ports, inter et périphériques de CDM rail',ClWhite);
|
||||
@@ -3401,7 +3460,10 @@ begin
|
||||
Affiche('nombre d''aiguillages: '+intToSTR(Naig_cdm),clyellow);
|
||||
|
||||
// sauvegarde
|
||||
sauve_ficher_cdm;
|
||||
sauve_ficher_cdm;
|
||||
|
||||
// crée les branches
|
||||
if nAig_CDM=0 then Affiche('Aucun aiguillage avec adresse, les branches ne peuvent pas être créées',clOrange)
|
||||
else
|
||||
Importation;
|
||||
end;
|
||||
|
||||
Reference in New Issue
Block a user