Simulateur Ferroviaire
Reconstruction et visualisation d'un réseau ferroviaire à partir de données GeoJSON — Win32 / WebView2 / Leaflet
Chargement...
Recherche...
Aucune correspondance
SwitchBlock.h
Aller à la documentation de ce fichier.
1
17#pragma once
18
19#include <array>
20#include <optional>
21#include <sstream>
22#include <string>
23#include <vector>
24
27#include "ShuntingElement.h"
28
38
39
41{
42public:
43
44 // =========================================================================
45 // Construction
46 // =========================================================================
47
48 SwitchBlock() = default;
49
57 SwitchBlock(std::string switchId,
58 CoordinateLatLon junctionWGS84,
59 std::vector<std::string> branchIds = {});
60
61 // =========================================================================
62 // Interface ShuntingElement
63 // =========================================================================
64
65 [[nodiscard]] std::string getId() const override { return m_id; }
66 [[nodiscard]] ElementType getType() const override { return ElementType::SWITCH; }
67 [[nodiscard]] ShuntingState getState() const override { return m_state; }
68
69 void setState(ShuntingState state) { m_state = state; }
70
71 // =========================================================================
72 // Requêtes — géométrie
73 // =========================================================================
74
76 [[nodiscard]] const CoordinateLatLon& getJunctionWGS84() const { return m_junctionWGS84; }
77
79 [[nodiscard]] const CoordinateXY& getJunctionUTM() const { return m_junctionUTM; }
80
82 [[nodiscard]] const std::optional<CoordinateLatLon>& getTipOnRoot() const { return m_tipOnRoot; }
83
85 [[nodiscard]] const std::optional<CoordinateLatLon>& getTipOnNormal() const { return m_tipOnNormal; }
86
88 [[nodiscard]] const std::optional<CoordinateLatLon>& getTipOnDeviation() const { return m_tipOnDeviation; }
89
91 [[nodiscard]] const std::vector<CoordinateLatLon>& getAbsorbedNormalCoordinates() const { return m_absorbedNormalCoords; }
92
94 [[nodiscard]] const std::vector<CoordinateLatLon>& getAbsorbedDeviationCoordinates() const { return m_absorbedDeviationCoords; }
95
97 [[nodiscard]] const std::vector<CoordinateXY>& getAbsorbedNormalCoordsUTM() const { return m_absorbedNormalCoordsUTM; }
98
100 [[nodiscard]] const std::vector<CoordinateXY>& getAbsorbedDeviationCoordsUTM() const { return m_absorbedDeviationCoordsUTM; }
101
103 [[nodiscard]] const std::optional<double>& getTotalLengthMeters() const { return m_totalLengthMeters; }
104
105 // =========================================================================
106 // Requêtes — topologie IDs
107 // =========================================================================
108
113 [[nodiscard]] const std::vector<std::string>& getBranchIds() const { return m_branchIds; }
114
116 [[nodiscard]] bool isOriented() const { return m_branches.root != nullptr; }
117
119 [[nodiscard]] const std::optional<std::string>& getRootBranchId() const { return m_rootBranchId; }
120
122 [[nodiscard]] const std::optional<std::string>& getNormalBranchId() const { return m_normalBranchId; }
123
125 [[nodiscard]] const std::optional<std::string>& getDeviationBranchId() const { return m_deviationBranchId; }
126
128 [[nodiscard]] const std::optional<std::string>& getDoubleOnNormal() const { return m_doubleOnNormal; }
129
131 [[nodiscard]] const std::optional<std::string>& getDoubleOnDeviation() const { return m_doubleOnDeviation; }
132
134 [[nodiscard]] bool isDouble() const
135 {
136 return m_doubleOnNormal.has_value() || m_doubleOnDeviation.has_value();
137 }
138
139 // =========================================================================
140 // Requêtes — pointeurs résolus
141 // =========================================================================
142
147 {
151 };
152
154 [[nodiscard]] const SwitchBranches& getBranches() const { return m_branches; }
155
157 [[nodiscard]] ShuntingElement* getRootBlock() const { return m_branches.root; }
158
160 [[nodiscard]] ShuntingElement* getNormalBlock() const { return m_branches.normal; }
161
163 [[nodiscard]] ShuntingElement* getDeviationBlock() const { return m_branches.deviation; }
164
169 [[nodiscard]] SwitchBlock* getPartnerOnNormal() const
170 {
171 return m_doubleOnNormal
172 ? static_cast<SwitchBlock*>(m_branches.normal)
173 : nullptr;
174 }
175
179 [[nodiscard]] SwitchBlock* getPartnerOnDeviation() const
180 {
182 ? static_cast<SwitchBlock*>(m_branches.deviation)
183 : nullptr;
184 }
185
186 // =========================================================================
187 // Requêtes — état opérationnel
188 // =========================================================================
189
191 [[nodiscard]] ActiveBranch getActiveBranch() const { return m_activeBranch; }
192
194 [[nodiscard]] bool isDeviationActive() const { return m_activeBranch == ActiveBranch::DEVIATION; }
195
197 [[nodiscard]] std::string activeBranchToString() const
198 {
199 return m_activeBranch == ActiveBranch::DEVIATION ? "DEVIATION" : "NORMAL";
200 }
201
203 [[nodiscard]] std::string toString() const;
204
205 // =========================================================================
206 // Mutations — identifiant
207 // =========================================================================
208
215 void setId(std::string id) { m_id = std::move(id); }
216
217 // =========================================================================
218 // Mutations — géométrie
219 // =========================================================================
220
221 void setRootBranchId(std::string id) { m_rootBranchId = std::move(id); }
222 void setNormalBranchId(std::string id) { m_normalBranchId = std::move(id); }
223 void setDeviationBranchId(std::string id) { m_deviationBranchId = std::move(id); }
224
229 [[nodiscard]] const std::optional<CoordinateXY>& getTipOnRootUTM() const
230 {
231 return m_tipOnRootUTM;
232 }
233
238 [[nodiscard]] const std::optional<CoordinateXY>& getTipOnNormalUTM() const
239 {
240 return m_tipOnNormalUTM;
241 }
242
247 [[nodiscard]] const std::optional<CoordinateXY>& getTipOnDeviationUTM() const
248 {
249 return m_tipOnDeviationUTM;
250 }
251
252 // SwitchBlock.h — section mutations géométrie
253
265 void setTipsUTM(std::optional<CoordinateXY> tipRoot,
266 std::optional<CoordinateXY> tipNormal,
267 std::optional<CoordinateXY> tipDeviation);
268
275
282
290 void setTips(std::optional<CoordinateLatLon> tipRoot,
291 std::optional<CoordinateLatLon> tipNormal,
292 std::optional<CoordinateLatLon> tipDeviation);
293
302 void setAbsorbedCoords(const std::string& side,
303 std::vector<CoordinateLatLon> coords);
304
305 // =========================================================================
306 // Mutations — topologie IDs
307 // =========================================================================
308
312 void addBranchId(const std::string& id);
313
319 void orient(std::string rootId, std::string normalId, std::string deviationId);
320
324 void swapNormalDeviation();
325
337 void absorbLink(const std::string& linkId,
338 const std::string& partnerId,
339 std::vector<CoordinateLatLon> linkCoordsWGS84,
340 std::vector<CoordinateXY> linkCoordsUTM);
341
352
358 void computeTotalLength();
359
360 // =========================================================================
361 // Mutations — pointeurs résolus (Phase9_RepositoryTransfer)
362 // =========================================================================
363
370
377
384
390 void setBranchPointers(SwitchBranches branches);
391
392 // =========================================================================
393 // Mutations — état opérationnel
394 // =========================================================================
395
402 void setActiveBranch(ActiveBranch branch, bool propagate = true);
403
411 ActiveBranch toggleActiveBranch(bool propagate = true);
412
413private:
414
415 // =========================================================================
416 // Champs — géométrie
417 // =========================================================================
418
421
424
426 std::optional<CoordinateLatLon> m_tipOnRoot;
427
429 std::optional<CoordinateLatLon> m_tipOnNormal;
430
432 std::optional<CoordinateLatLon> m_tipOnDeviation;
433
438 std::optional<double> m_totalLengthMeters;
439
441 std::vector<CoordinateLatLon> m_absorbedNormalCoords;
442
444 std::vector<CoordinateLatLon> m_absorbedDeviationCoords;
445
446 std::vector<CoordinateXY> m_absorbedNormalCoordsUTM;
447 std::vector<CoordinateXY> m_absorbedDeviationCoordsUTM;
448
450 std::optional<CoordinateXY> m_tipOnRootUTM;
451
453 std::optional<CoordinateXY> m_tipOnNormalUTM;
454
456 std::optional<CoordinateXY> m_tipOnDeviationUTM;
457
458 // =========================================================================
459 // Champs — topologie IDs
460 // =========================================================================
461
463 std::vector<std::string> m_branchIds;
464
466 std::optional<std::string> m_rootBranchId;
467
469 std::optional<std::string> m_normalBranchId;
470
472 std::optional<std::string> m_deviationBranchId;
473
475 std::optional<std::string> m_doubleOnNormal;
476
478 std::optional<std::string> m_doubleOnDeviation;
479
480 // =========================================================================
481 // Champs — pointeurs résolus
482 // =========================================================================
483
486
487 // =========================================================================
488 // Champs — état opérationnel
489 // =========================================================================
490
493
494 // =========================================================================
495 // Helpers privés
496 // =========================================================================
497
506 static double haversineDistanceMeters(const CoordinateLatLon& a,
507 const CoordinateLatLon& b);
508};
Représentation d'une coordonnée géographique WGS-84 (latitude, longitude).
Représentation d'une coordonnée plane en mètres (système métrique UTM).
ElementType
Types d'éléments interactifs ferroviaires.
Definition Element.h:18
Interface abstraite pour tous les éléments de shuntage ferroviaire.
ShuntingState
État opérationnel d'un élément de shuntage.
Definition ShuntingElement.h:18
ActiveBranch
Branche active d'un aiguillage.
Definition SwitchBlock.h:37
Coordonnée géographique WGS-84 exprimée en degrés décimaux.
Definition CoordinateLatLon.h:22
Coordonnée plane en mètres dans un système métrique (UTM ou similaire).
Definition CoordinateXY.h:23
std::string m_id
id de l'element
Definition Element.h:71
Interface abstraite pour tous les éléments de shuntage ferroviaire.
Definition ShuntingElement.h:39
ShuntingState m_state
Definition ShuntingElement.h:82
Definition SwitchBlock.h:41
void computeTotalLength()
Calcule et mémorise la longueur totale de traversée. Formule : root_leg + max(normal_leg,...
Definition SwitchBlock.cpp:57
ElementType getType() const override
Retourne le type de l'élément.
Definition SwitchBlock.h:66
std::vector< CoordinateXY > m_absorbedNormalCoordsUTM
Definition SwitchBlock.h:446
std::optional< CoordinateXY > m_tipOnDeviationUTM
Definition SwitchBlock.h:456
void setTipsUTM(std::optional< CoordinateXY > tipRoot, std::optional< CoordinateXY > tipNormal, std::optional< CoordinateXY > tipDeviation)
Assigne les trois tips CDC en coordonnées UTM.
Definition SwitchBlock.cpp:294
void setJunctionWGS84(CoordinateLatLon coord)
Assigne la position de jonction en WGS84.
Definition SwitchBlock.h:274
const SwitchBranches & getBranches() const
Retourne les branches résolues. nullptr si non initialisé.
Definition SwitchBlock.h:154
bool isDouble() const
True si un segment de liaison a été absorbé (double aiguille).
Definition SwitchBlock.h:134
void setJunctionUTM(CoordinateXY coord)
Assigne la position de jonction en UTM.
Definition SwitchBlock.h:281
std::optional< CoordinateXY > m_tipOnNormalUTM
Definition SwitchBlock.h:453
void setTips(std::optional< CoordinateLatLon > tipRoot, std::optional< CoordinateLatLon > tipNormal, std::optional< CoordinateLatLon > tipDeviation)
Assigne les trois tips CDC en une seule opération.
Definition SwitchBlock.cpp:39
const CoordinateLatLon & getJunctionWGS84() const
Coordonnée WGS-84 du point de jonction physique.
Definition SwitchBlock.h:76
std::vector< CoordinateXY > m_absorbedDeviationCoordsUTM
Definition SwitchBlock.h:447
const std::optional< CoordinateLatLon > & getTipOnNormal() const
Definition SwitchBlock.h:85
void setDeviationPointer(ShuntingElement *elem)
Assigne le pointeur de la branche déviée.
Definition SwitchBlock.h:383
const std::vector< std::string > & getBranchIds() const
IDs des StraightBlocks connectés à la jonction. Peuplé lors de la construction du graphe.
Definition SwitchBlock.h:113
std::vector< CoordinateLatLon > m_absorbedDeviationCoords
Definition SwitchBlock.h:444
void setRootPointer(ShuntingElement *elem)
Assigne le pointeur de la branche root.
Definition SwitchBlock.h:369
const std::optional< CoordinateLatLon > & getTipOnRoot() const
Definition SwitchBlock.h:82
ShuntingElement * getDeviationBlock() const
Accès direct à la branche déviée. nullptr si non résolue.
Definition SwitchBlock.h:163
std::optional< CoordinateLatLon > m_tipOnNormal
Definition SwitchBlock.h:429
std::string activeBranchToString() const
Convertit ActiveBranch en chaîne lisible pour les logs.
Definition SwitchBlock.h:197
ActiveBranch toggleActiveBranch(bool propagate=true)
Alterne entre NORMAL et DEVIATION.
Definition SwitchBlock.cpp:178
const std::optional< std::string > & getRootBranchId() const
ID de la branche root. Absent si non orienté.
Definition SwitchBlock.h:119
const std::vector< CoordinateLatLon > & getAbsorbedNormalCoordinates() const
Polyligne absorbée côté normal (double switch). Vide si non applicable.
Definition SwitchBlock.h:91
std::optional< std::string > m_deviationBranchId
Definition SwitchBlock.h:472
CoordinateLatLon m_junctionWGS84
Definition SwitchBlock.h:420
void absorbLink(const std::string &linkId, const std::string &partnerId, std::vector< CoordinateLatLon > linkCoordsWGS84, std::vector< CoordinateXY > linkCoordsUTM)
Absorbe le segment de liaison d'un double aiguille.
Definition SwitchBlock.cpp:109
std::vector< CoordinateLatLon > m_absorbedNormalCoords
Definition SwitchBlock.h:441
std::vector< std::string > m_branchIds
Definition SwitchBlock.h:463
const std::optional< std::string > & getNormalBranchId() const
ID de la branche normale. Absent si non orienté.
Definition SwitchBlock.h:122
std::optional< std::string > m_doubleOnNormal
Definition SwitchBlock.h:475
std::optional< std::string > m_normalBranchId
Definition SwitchBlock.h:469
void setRootBranchId(std::string id)
Definition SwitchBlock.h:221
const std::optional< std::string > & getDeviationBranchId() const
ID de la branche déviée. Absent si non orienté.
Definition SwitchBlock.h:125
SwitchBlock * getPartnerOnNormal() const
Retourne le switch partenaire côté normal, ou nullptr. Cast valide uniquement si isDouble() && getDou...
Definition SwitchBlock.h:169
std::optional< std::string > m_doubleOnDeviation
Definition SwitchBlock.h:478
ActiveBranch m_activeBranch
Definition SwitchBlock.h:492
void setState(ShuntingState state)
Definition SwitchBlock.h:69
std::string toString() const
Représentation textuelle pour le débogage.
Definition SwitchBlock.cpp:200
const std::vector< CoordinateXY > & getAbsorbedNormalCoordsUTM() const
UTM absorbée côté deviation (double switch). Vide si non applicable.
Definition SwitchBlock.h:97
bool isOriented() const
True si les rôles root/normal/deviation sont assignés.
Definition SwitchBlock.h:116
void setAbsorbedCoords(const std::string &side, std::vector< CoordinateLatLon > coords)
Stocke les coordonnées absorbées d'un double switch.
Definition SwitchBlock.cpp:48
const std::optional< CoordinateXY > & getTipOnRootUTM() const
Point CDC côté root en UTM. Absent si non orienté. Miroir UTM de getTipOnRoot().
Definition SwitchBlock.h:229
void setNormalBranchId(std::string id)
Definition SwitchBlock.h:222
std::optional< std::string > m_rootBranchId
Definition SwitchBlock.h:466
const std::vector< CoordinateLatLon > & getAbsorbedDeviationCoordinates() const
Polyligne absorbée côté deviation (double switch). Vide si non applicable.
Definition SwitchBlock.h:94
ShuntingElement * getRootBlock() const
Accès direct à la branche root. nullptr si non résolue.
Definition SwitchBlock.h:157
const std::optional< std::string > & getDoubleOnDeviation() const
ID du partenaire double switch côté deviation. Absent si non applicable.
Definition SwitchBlock.h:131
std::optional< CoordinateLatLon > m_tipOnDeviation
Definition SwitchBlock.h:432
std::optional< CoordinateXY > m_tipOnRootUTM
Definition SwitchBlock.h:450
const std::optional< double > & getTotalLengthMeters() const
Longueur physique de traversée en mètres. Absent si tips manquants.
Definition SwitchBlock.h:103
static double haversineDistanceMeters(const CoordinateLatLon &a, const CoordinateLatLon &b)
Calcule la distance de Haversine entre deux points WGS-84.
Definition SwitchBlock.cpp:310
void replaceBranchPointer(ShuntingElement *oldElem, ShuntingElement *newElem)
Remplace un pointeur de branche par un autre.
Definition SwitchBlock.cpp:155
ShuntingState getState() const override
Retourne l'état opérationnel courant de l'élément.
Definition SwitchBlock.h:67
ActiveBranch getActiveBranch() const
Branche actuellement active (NORMAL par défaut).
Definition SwitchBlock.h:191
void setDeviationBranchId(std::string id)
Definition SwitchBlock.h:223
std::optional< double > m_totalLengthMeters
Definition SwitchBlock.h:438
const CoordinateXY & getJunctionUTM() const
Coordonnée UTM du point de jonction (x = est, y = nord, mètres).
Definition SwitchBlock.h:79
const std::vector< CoordinateXY > & getAbsorbedDeviationCoordsUTM() const
UTM absorbée côté deviation (double switch). Vide si non applicable.
Definition SwitchBlock.h:100
void orient(std::string rootId, std::string normalId, std::string deviationId)
Assigne les rôles root / normal / deviation.
Definition SwitchBlock.cpp:80
void setBranchPointers(SwitchBranches branches)
Enregistre les branches en une seule opération.
Definition SwitchBlock.cpp:144
ShuntingElement * getNormalBlock() const
Accès direct à la branche normale. nullptr si non résolue.
Definition SwitchBlock.h:160
SwitchBlock()=default
bool isDeviationActive() const
Raccourci — évite la comparaison explicite.
Definition SwitchBlock.h:194
std::optional< CoordinateLatLon > m_tipOnRoot
Definition SwitchBlock.h:426
std::string getId() const override
Retourne l'identifiant unique de l'élément (ex. "sw/3", "s/12").
Definition SwitchBlock.h:65
SwitchBranches m_branches
Definition SwitchBlock.h:485
const std::optional< std::string > & getDoubleOnNormal() const
ID du partenaire double switch côté normal. Absent si non applicable.
Definition SwitchBlock.h:128
const std::optional< CoordinateLatLon > & getTipOnDeviation() const
Definition SwitchBlock.h:88
void setId(std::string id)
Assigne l'identifiant du bloc. Appelé par Phase6_BlockExtractor lors de la création du bloc.
Definition SwitchBlock.h:215
void setActiveBranch(ActiveBranch branch, bool propagate=true)
Assigne la branche active.
Definition SwitchBlock.cpp:168
const std::optional< CoordinateXY > & getTipOnNormalUTM() const
Point CDC côté normal en UTM. Absent si non orienté. Miroir UTM de getTipOnNormal().
Definition SwitchBlock.h:238
const std::optional< CoordinateXY > & getTipOnDeviationUTM() const
Point CDC côté déviation en UTM. Absent si non orienté. Miroir UTM de getTipOnDeviation().
Definition SwitchBlock.h:247
void addBranchId(const std::string &id)
Ajoute un ID de branche. Pas de doublon.
Definition SwitchBlock.cpp:74
SwitchBlock * getPartnerOnDeviation() const
Retourne le switch partenaire côté deviation, ou nullptr.
Definition SwitchBlock.h:179
CoordinateXY m_junctionUTM
Definition SwitchBlock.h:423
void setNormalPointer(ShuntingElement *elem)
Assigne le pointeur de la branche normale.
Definition SwitchBlock.h:376
void swapNormalDeviation()
Échange normal ↔ deviation (rôles + tips + polylignes absorbées + doubles).
Definition SwitchBlock.cpp:99
Branches topologiques résolues (pointeurs non-propriétaires).
Definition SwitchBlock.h:147
ShuntingElement * deviation
Sortie déviée.
Definition SwitchBlock.h:150
ShuntingElement * normal
Sortie directe.
Definition SwitchBlock.h:149
ShuntingElement * root
Tronc entrant.
Definition SwitchBlock.h:148