|
Simulateur Ferroviaire
Reconstruction et visualisation d'un réseau ferroviaire à partir de données GeoJSON — Win32 / WebView2 / Leaflet
|
Engine Core regroupe les services transversaux utilisés par tous les autres modules. Il ne contient aucune logique métier ferroviaire — seulement des briques d'infrastructure réutilisables.
| Sous-module | Dossier | Rôle |
|---|---|---|
| Logger | Engine/Core/Logger/ | Journalisation à 5 niveaux |
| ParserConfig | Engine/Core/Config/ | Paramètres du pipeline |
| Coordonnées | Engine/Core/Coordinates/ | WGS-84 et UTM |
| Topologie | Engine/Core/Topology/ | Repository, rendu |
Logger fournit un canal de journalisation par moteur : chaque instance est associée à un nom de moteur (ex. "GeoParser", "HMI") et écrit dans Logs/<nomDuMoteur>.log. Les traces sont simultanément envoyées à la sortie de débogage Visual Studio via OutputDebugStringA.
Les écritures sont protégées par un std::mutex — le Logger est utilisable depuis plusieurs threads sans synchronisation externe.
| Niveau | Macro | Utilisation |
|---|---|---|
DEBUG | LOG_DEBUG | Valeurs intermédiaires, état interne |
INFO | LOG_INFO | Événements nominaux (fin de phase, résultats) |
WARNING | LOG_WARNING | Anomalie non-bloquante (données douteuses, repli) |
ERROR | LOG_ERROR | Erreur bloquante récupérable |
FAILURE | LOG_FAILURE | Erreur fatale — journalise puis lève std::runtime_error |
Le niveau minimum de filtrage est configurable via setMinimumLogLevel(). En production, positionner à INFO supprime les traces DEBUG sans modifier le code.
Exemple :
Sur MSVC, __FUNCTION__ retourne "NomDeClasse::NomDeFonction". Les macros LOG_* transmettent __FUNCTION__ et __LINE__ au Logger, qui extrait automatiquement le nom de classe et le nom de méthode pour les inclure dans chaque ligne.
**
LOG_FAILURE** journalise le message puis appelleLogger::triggerFatalCrash(), qui lèvestd::runtime_error. Il ne retourne jamais — ne pas l'utiliser dans des destructeurs.
Un fichier de log = une instance de Logger. Les instances ne sont pas copiables (constructeur de copie supprimé). Partager un logger entre plusieurs objets se fait par référence ou pointeur — jamais par valeur.
ParserConfig est un agrégat de paramètres numériques qui gouvernent le comportement du pipeline GeoParser. Tous les champs ont des valeurs par défaut compilées.
| Champ | Type | Défaut | Signification |
|---|---|---|---|
snapTolerance | double | 1,0 m | Distance de fusion de deux extrémités |
intersectionEpsilon | double | 0,5 m | Tolérance pour les intersections géométriques |
minSwitchAngle | double | 5,0 ° | Angle minimal d'une bifurcation pour être classée SWITCH |
minBranchLength | double | 0,5 m | Longueur minimale d'une branche d'aiguillage |
maxSegmentLength | double | 200,0 m | Longueur au-delà de laquelle un straight est subdivisé |
junctionTrimMargin | double | 3,0 m | Recul des tips CDC depuis la jonction |
switchSideSize | double | 15,0 m | Demi-longueur des stubs CDC |
doubleSwitchRadius | double | 20,0 m | Rayon de détection des aiguilles doubles |
ParserConfigIni gère la sérialisation dans un fichier .ini simple (format clé=valeur, un paramètre par ligne). Le chemin par défaut est retourné par ParserConfigIni::defaultPath(). load() retourne les valeurs par défaut si le fichier est absent ou illisible ; save() crée le fichier si nécessaire.
Le projet utilise deux systèmes de coordonnées selon le contexte :
Coordonnées géographiques standards (latitude, longitude en degrés décimaux). Utilisées pour :
TopologyRenderer.Coordonnées planes métriques (x = est, y = nord, en mètres). Utilisées pour tous les calculs métriques du pipeline (distances, angles, intersections, subdivisions). La projection UTM est effectuée par les phases amont du pipeline.
Règle de cohabitation : les deux collections (
pointsWGS84/pointsUTM) dans StraightBlock ont toujours le même nombre de points et les mêmes indices. Opérer toujours surUTMpour les calculs ; utiliserWGS84uniquement pour le rendu.
La fonction haversineDistanceMeters(a, b) calcule la distance géodésique entre deux points WGS-84. Elle est utilisée par Phase 7 pour interpoler les tips CDC à distance switchSideSize de la jonction, et pour calculer StraightBlock::getLengthMeters().
Singleton global (TopologyRepository::instance()) qui détient le TopologyData produit par le pipeline. Il expose :
data() — référence constante vers les vecteurs de blocs et les index.load(data) — transfert par déplacement depuis le pipeline (appelé par Phase8_RepositoryTransfer::transfer()).clear() — réinitialisation avant un nouveau parsing.Après load(), les adresses des blocs sont stables : aucun vecteur ne se réalloue. Les pointeurs non-propriétaires distribués par PCCGraphBuilder restent valides jusqu'au prochain clear().
TopologyData est le conteneur central :
buildIndex() construit les maps id → ptr après le transfert. Il doit être appelé une seule fois, après stabilisation des adresses.
TopologyRenderer génère les scripts JavaScript injectés dans la page Leaflet via WebViewPanel::executeScript(). Il opère exclusivement sur les collections WGS-84 des blocs.
Point d'entrée principal : renderAllTopology() — produit en une passe les appels clearStraightBlocks(), renderStraightBlock(), clearSwitchBranches(), renderSwitchBranches(), clearSwitches(), renderSwitch().
updateSwitchBlocks(sw) produit les appels switchApplyState() pour mettre à jour visuellement un aiguillage après toggleActiveBranch().
| Classe | Fichier | Rôle |
|---|---|---|
| Logger | Engine/Core/Logger/Logger.h | Journalisation multi-niveaux |
| LogLevel | Engine/Core/Logger/Logger.h | Enum de sévérité |
| ParserConfig | Engine/Core/Config/ParserConfig.h | Paramètres numériques |
| ParserConfigIni | Engine/Core/Config/ParserConfigIni.h | Persistance INI |
| CoordinateLatLon | Engine/Core/Coordinates/CoordinateLatLon.h | WGS-84 |
| CoordinateXY | Engine/Core/Coordinates/CoordinateXY.h | UTM (x,y mètres) |
| TopologyRepository | Engine/Core/Topology/TopologyRepository.h | Singleton détenteur |
| TopologyData | Engine/Core/Topology/TopologyData.h | Vecteurs + index |
| TopologyRenderer | Engine/Core/Topology/TopologyRenderer.h | Rendu Leaflet JS |