This commit is contained in:
f1iwq2
2024-03-06 15:41:14 +01:00
parent 315b803e40
commit 81d5c007d4
25 changed files with 2640 additions and 1884 deletions

View File

@@ -1,7 +1,7 @@
unit UnitAnalyseSegCDM;
// importation des données de CDM
// Affichage de la page du réseau CDM
// les Tjs ne sont pas traitées
// les Tjs ne sont pas traitées (de toute façon CDM ne les gère pas)
// fichier source CDM générateur de l'export : cd_cdb.c version 2.0
interface
@@ -11,18 +11,16 @@ uses
math, Printers ;
const
max_db = 20; // 20 détecteurs maxi entre 2 aiguillages
max_db = 20; // 20 détecteurs maxi entre 2 aiguillages
pisur180=pi/180 ;
_180surpi=180/pi;
// décalages d'affichages
yCrOffset=-5;
yCrOffset=-5; // décalages d'affichages pour les adresses
yCrOffset2=-14;
yTurnoutOffset=-16;
Zmini=50;
Zmaxi=100;
fond_cdm=$303000;
precision_clic=4; // précision du clic sur un élément
Zmini=50; // zoom mini
Zmaxi=100; // zoom maxi
fond_cdm=$303000; // couleur de fond de la fenêtre
precision_clic=4; // précision en pixels du clic sur un élément
type
TFormAnalyseCDM = class(TForm)
@@ -79,91 +77,86 @@ type
{ Déclarations publiques }
end;
// tableau des détecteurs sur un segment
TdetSeg= array[1..10] of record
index,periph : integer;
end;
end;
Trec_cdm = record adresse : integer;
distance : integer; // distance au port d'entrée
end;
tDetect_cdm= array[1..max_db] of Trec_cdm;
// structure d'aiguillage de CDM
TAig_CDM = record
adresse,adrtriple,temps : integer;
modele : TEquipement ;
ADroit : integer ; // (TJD:identifiant extérieur) connecté sur la position droite en talon
ADroitB : char ; // P D S Z
ADevie : integer ; // (TJD:identifiant extérieur) adresse de l'élément connecté en position déviée
ADevieB : char; // caractère (D ou S)si aiguillage de l'élément connecté en position déviée
APointe : integer; // adresse de l'élément connecté en position droite ;
APointeB : char;
DDroit : integer; // destination de la TJD en position droite
DDroitB : char ;
DDevie : integer; // destination de la TJD en position déviée
DDevieB : char ;
adresse,adrtriple,temps : integer;
modele : TEquipement ;
ADroit : integer ; // (TJD:identifiant extérieur) connecté sur la position droite en talon
ADroitB : char ; // P D S Z
ADevie : integer ; // (TJD:identifiant extérieur) adresse de l'élément connecté en position déviée
ADevieB : char; // caractère (D ou S)si aiguillage de l'élément connecté en position déviée
APointe : integer; // adresse de l'élément connecté en position droite ;
APointeB : char;
DDroit : integer; // destination de la TJD en position droite
DDroitB : char ;
DDevie : integer; // destination de la TJD en position déviée
DDevieB : char ;
Adevie2 : integer;
Adevie2B : char ;
// états d'une TJD (2 ou 4, 4 par défaut)
EtatTJD : integer;
// si l'aiguillage provient d'une traversée double jonction
bdj : boolean;
adrCDM : integer; // adresse de la bjd dans cdm
IndexSeg : integer; //
Adevie2 : integer;
Adevie2B : char ;
// états d'une TJD (2 ou 4, 4 par défaut)
EtatTJD : integer;
bdj : boolean; // si l'aiguillage provient d'une traversée double jonction
adrCDM : integer; // adresse de la bjd dans cdm
IndexSeg : integer;
end;
end;
// structure segment, port et periph de CDM
TInter = record
x,y,z : integer;
typ : string[20];
MirrorZ : integer;
MirrorParent : integer;
end;
// structure segment, port et periph de CDM
TInter =
record
x,y,z : integer;
typ : string[20];
MirrorZ : integer;
MirrorParent : integer;
end;
Tport = record
numero : integer; // numéro du port
typ : string[20];
x,y,z,angle : integer;
local : integer; // numéro de port local
connecte : boolean;
ConnecteAuPort : integer; // connecté au port
ConnecteAuSeg : integer; // connecté au segment
end;
Tport =
record
numero : integer; // numéro du port
typ : string[20];
x,y,z,angle : integer;
local : integer; // numéro de port local
connecte : boolean;
ConnecteAuPort : integer; // connecté au port
ConnecteAuSeg : integer; // connecté au segment
end;
TPeriph = record
numero : integer; // numéro du port
typ : string[20];
pere : integer;
x,y,z,angle : integer;
bright,bdown : integer;// sens et position par rapport à la voie
location : integer; // ?? en %
adresse : integer;
status : integer;
OnDevicePort : integer;
end;
TPeriph =
record
numero : integer; // numéro du port
typ : string[20];
pere : integer;
x,y,z,angle : integer;
bright,bdown : integer;// sens et position par rapport à la voie
location : integer; // ?? en %
adresse : integer;
status : integer;
OnDevicePort : integer;
end;
Tsegment =
record
numero : integer;
typ : string[20]; // arc, turnout, ...
nport,nperiph,nInter : integer; // nombre de ports et de peripheriques et d'intersections
port : array of TPort;
periph : array of TPeriph;
inter : array of TInter;
XMin,Ymin,XMax,Ymax,StartAngle,ArcAngle,Rayon,radius0,angle0,angle,lengthdev,deltadev0 : integer;
lXc,lYc : integer;
// turnout
longueur,longueurDev,DeltaDev,Curveoffset : integer;
// turnout curve
xc0,yc0,DeltaDev2,xc,yc : integer;
// pour signaux complexes
adresse,adresse2,duree,adr_CDM : integer;
end;
Tsegment = record
numero : integer;
typ : string[20]; // arc, turnout, ...
nport,nperiph,nInter : integer; // nombre de ports, de peripheriques et d'intersections
port : array of TPort;
periph : array of TPeriph;
inter : array of TInter;
XMin,Ymin,XMax,Ymax,StartAngle,ArcAngle,Rayon,radius0,angle0,angle,lengthdev,deltadev0 : integer;
lXc,lYc : integer;
// turnout
longueur,longueurDev,DeltaDev,Curveoffset : integer;
// turnout curve
xc0,yc0,DeltaDev2,xc,yc : integer;
// pour signaux complexes
adresse,adresse2,duree,adr_CDM : integer;
end;
var Segment : array of Tsegment;
@@ -193,7 +186,7 @@ uses Importation;
{$R *.dfm}
//
// renvoie l'index d'un aiguillage CDM d'adresse "adresse"
function index_aigCdm(adresse : integer) : integer;
var i : integer;
trouve : boolean;
@@ -206,7 +199,10 @@ begin
if trouve then result:=i-1 else result:=0;
end;
// cherche, isole et restreint la chaine s qui contient "chercher"
// cherche, isole et restreint la chaine s qui contient "chercher", et réduit s
// ex: isole_valeur(' periph #135 ','periph #',true)
// renvoie '135' et s='periph'
function isole_valeur(var s : string; chercher : string;afficheErr : boolean) : string;
var i : integer;
serr : string;
@@ -316,7 +312,7 @@ begin
val(s2,i,erreur);
Segment[nSeg-1].periph[nperiph-1].status:=i;
// peut être suivi de 'On device port'
// peut être suivi de 'On device port' si une adresse de détecteur ou d'actionneur se trouve sur l'appareil de voie
Segment[nSeg-1].periph[nperiph-1].OnDevicePort:=-1; // marqueur d'invalidité
s:=AnsiLowerCase(lignes[nligne+1]);
if pos('on device port',s)<>0 then
@@ -880,6 +876,7 @@ begin
degtoRad:=angle*pisur180;
end;
// dessine un arc dans le canvas, dont le centre est CenterX,Y de rayon , angle de départ et de stop en degrés
procedure D_Arc(Canvas: TCanvas; CenterX,CenterY: integer;
rayon: Integer; StartDegres, StopDegres: Double);
var
@@ -1009,7 +1006,7 @@ end;
// trace un arc selon les coordonnées CDM
procedure angle_cdm(canvas : Tcanvas;centreX,centreY:integer;debut,fin : double ;rayon : integer);
begin
coords(centreX,centreY);
coords(centreX,centreY); // transforme en coords windows
rayon:=round(rayon*reducX) div 1000;
D_arc(Canvas,centreX,centreY,rayon,debut,fin);
end;
@@ -1081,7 +1078,7 @@ end;
// dessine un arc orienté de xa,ya à xb,yb dans le canvas image (pas imprimante)
// coordonnées CDM
procedure arc_xy(canvas : tcanvas;centreX,centreY,rayon,xa,ya,xb,yb : integer);
procedure arc_xy_CDM(canvas : tcanvas;centreX,centreY,rayon,xa,ya,xb,yb : integer);
var x1,y1,x2,y2: integer ;
arcXa,arcYa,arcxb,arcYb,angleA,angleB,
cosA,SinA,CosB,SinB,vectoriel,AngleAB: double;
@@ -1235,7 +1232,7 @@ begin
canvas.pen.color:=clred;
//ligneCDM(canvas,milieuX,milieuY,centreX,centreY);
//ligneCDM(canvas,x0,y0,x1,y1);
arc_xy(canvas,centreX,centreY,round(rayonD)+250,x1,y1,x0,y0);
arc_xy_CDM(canvas,centreX,centreY,round(rayonD)+250,x1,y1,x0,y0);
centreX:=round(-rayonD*cos(alpha))+MilieuX;
centreY:=round(pente*centreX+b);
@@ -1243,7 +1240,7 @@ begin
canvas.pen.color:=clyellow;
//ligneCDM(canvas,milieuX,milieuY,centreX,centreY);
//ligneCDM(canvas,x0,y0,x1,y1);
arc_xy(canvas,centreX,centreY,round(rayonD)+250,x1,y1,x0,y0);
arc_xy_CDM(canvas,centreX,centreY,round(rayonD)+250,x1,y1,x0,y0);
exit;
// méthode directe
@@ -1284,7 +1281,7 @@ begin
centreX:=x0+5000;
centreY:=round(pente*centreX+b);
rayon:=round(sqrt(sqr(centreX-x0)+sqr(centreY-y0)));
arc_xy(canvas,centreX,centreY,rayon,x2,y2,x0,y0);
arc_xy_CDM(canvas,centreX,centreY,rayon,x2,y2,x0,y0);
// point de départ en vert
canvas.pen.color:=clLime;
@@ -1309,7 +1306,7 @@ begin
TmpBmp.Free;
end;
// rotation matricielle autour de Centre
// rotation matricielle de l'angle (en radians) autour de Centre
function XForm_Rotation(Angle : Single;Centre : TPoint) : TXForm;
var SinA,CosA: Extended;
begin
@@ -1389,10 +1386,10 @@ begin
GMode:=SetGraphicsMode(ACanvas.Handle, GM_ADVANCED);
if GetWorldTransform(ACanvas.Handle, XFormOld) then // renvoie la matrice courante dans XformOld
begin
// faire les transformations
// faire les 3 transformations
XFormRot:=XForm_Rotation(Angle,Point(l2,h2)); // rotation autour du centre
XFormScale:=XForm_Echelle(Zoom,Zoom,point(l2,h2)); // Zoom au point central
XFormXLat:=XForm_Translation(x-l2,y-h2); // décalage
XFormScale:=XForm_Echelle(Zoom,Zoom,point(l2,h2)); // Zoom au point central
XFormXLat:=XForm_Translation(x-l2,y-h2); // décalage
// Combiner les 3 transformations
CombineTransform(XForm,XFormRot,XFormScale); // Xform<-- f(XformRot,XformScale)
@@ -1401,7 +1398,7 @@ begin
// calcule les coordonnées des 4 points de coins de l'icone qui a tourné et zoomé
// x0,y0 x3,y3
// x1,y1 x2,y2
d:=sqrt( sqr(l2)+ sqr(h2));
d:=sqrt(sqr(l2)+ sqr(h2));
//c1:=round(zoom*l2); // pour faire la rotation à la tete du train
//c2:=round(zoom*h2);
z:=zoom*d;
@@ -3845,7 +3842,7 @@ begin
Segment[nSeg-1].port[2].ConnecteAuPort:=992; // le port 0 est la pointe
Segment[nSeg-1].port[2].ConnecteAuSeg:=992;
end;
end;
// compile le fichier Texte de CDM se trouvant en fenêtre principale et l'importe
procedure Compilation;
@@ -4638,8 +4635,6 @@ begin
end;
inc(i);
until (i>nseg-1);
nombre:=itablo;
result:=itablo>0;
nombre:=itablo;
result:=itablo>0;
end;
@@ -4705,7 +4700,7 @@ begin
CentreY:=segment[ind1].lyc;
Canvas.pen.color:=clred;
x1:=segment[ind1].periph[per1].x;
y1:=segment[ind1].periph[per1].y;
y1:=segment[ind1].periph[per1].y;
x2:=segment[ind1].periph[per2].x;
y2:=segment[ind1].periph[per2].y;
canvas.pen.Color:=clred;
@@ -4842,7 +4837,7 @@ begin
// déterminer la destination
// trouve le port connecté au segment suivant
tp:=index_port_connecte(index,circuit_det[2].index,indexPort);
// trouver les coordonnées su x,y sur lequel est connecté le port
// trouver les coordonnées su x,y sur lequel est connecté le port
xs:=Segment[index].port[IndexPort].x;
ys:=Segment[index].port[IndexPort].y;
// donc tracer un arc de (x,y) détecteur à (xs,ys) port
@@ -4917,7 +4912,7 @@ begin
// déterminer la destination
// trouve le port connecté au segment précédent
tp:=index_port_connecte(index,circuit_det[NindexR-1].index,indexPort);
// trouver les coordonnées su x,y sur lequel est connecté le port
// trouver les coordonnées su x,y sur lequel est connecté le port
xs:=Segment[index].port[IndexPort].x;
ys:=Segment[index].port[IndexPort].y;
// donc tracer un arc de (x,y) (détecteur) à (xs,ys) port