From 920de35b60e4cf35e346b00ea81a4bca59b6ac2c Mon Sep 17 00:00:00 2001 From: izawartka <59137928+izawartka@users.noreply.github.com> Date: Thu, 3 Jul 2025 16:27:25 +0200 Subject: [PATCH] Added extended signal signs text option +Extended signal renderering: Signs mounted on signals can now have displayed text over them (i.e. W21 sign). During the parsing, the text string is extracted from the sign name using regex from the sign's def --- src/components/map/Map.css | 4 +++ .../SignalExtendedRenderer.js | 26 +++++++++++++++++-- src/helpers/constants.js | 4 ++- src/model/signal-elements/parsers/common.js | 16 +++++++++++- 4 files changed, 46 insertions(+), 4 deletions(-) diff --git a/src/components/map/Map.css b/src/components/map/Map.css index f99c711..eadb3f5 100644 --- a/src/components/map/Map.css +++ b/src/components/map/Map.css @@ -99,6 +99,10 @@ fill: #111; } +.map .signal-sign-text { + stroke: none; +} + .map svg g.nevp path { fill: #eee; } diff --git a/src/components/map/object-renderers/SignalExtendedRenderer.js b/src/components/map/object-renderers/SignalExtendedRenderer.js index 5e52599..3ab9048 100644 --- a/src/components/map/object-renderers/SignalExtendedRenderer.js +++ b/src/components/map/object-renderers/SignalExtendedRenderer.js @@ -321,6 +321,21 @@ function getBars(object, polePoints, headOffsetY) { } } +function getSignText(id, text, y) { + if(!text) return null; + const def = DefinedSignalSigns[id]; + if(!def) return null; + + return {text}; +} + function getSign(id, y) { const def = DefinedSignalSigns[id]; if(!def) return null; @@ -342,9 +357,16 @@ function getSigns(object, polePoints, headOffsetY) { const signs = []; let y = headOffsetY + polePoints.signs; - for(const [key, def] of Object.entries(DefinedSignalSigns)) { - if(!object.signal_elements.signs.hasOwnProperty(key) || !DefinedSignalSigns[key]) continue; + for(const [id, def] of Object.entries(DefinedSignalSigns)) { + if(!object.signal_elements.signs.hasOwnProperty(id) || !DefinedSignalSigns[id]) continue; const height = (def.height || 1.0); + const text = object.signal_elements.signs[id]?.text || null; + const signY = y - height / 2 + 0.1; + + signs.push(getSign(id, signY, text)); + + const textComponent = getSignText(id, text, signY); + if(textComponent) signs.push(textComponent); signs.push(getSign(key, y - height / 2 + 0.1)); y -= height + 0.2; diff --git a/src/helpers/constants.js b/src/helpers/constants.js index b6f2107..190444c 100644 --- a/src/helpers/constants.js +++ b/src/helpers/constants.js @@ -45,7 +45,9 @@ const Constants = { signalElemsUnknownPrefab: true, signalElemsRecognizedUnknownPrefab: true, attachSignsOutOfBounds: true, - signalElemsUnknownSign: true + signalElemsUnknownSign: true, + signalElemsUnknownSignText: true, + }, errors: { invalidSceneryInfo: true diff --git a/src/model/signal-elements/parsers/common.js b/src/model/signal-elements/parsers/common.js index 94b0e96..66322b1 100644 --- a/src/model/signal-elements/parsers/common.js +++ b/src/model/signal-elements/parsers/common.js @@ -109,8 +109,22 @@ export default class SignalElementsParserCommon { SceneryParserLog.warn('signalElemsUnknownSign', `Unknown signal sign: ${entry}`); continue; } - + signs[key] = true; + + const def = DefinedSignalSigns[key]; + if(!def.textRegex) continue; + + const match = def.textRegex.exec(entry); + if(!match) { + SceneryParserLog.warn('signalElemsUnknownSignText', `Signal sign ${entry} does not match text regex for ${key}`); + continue; + } + + const text = match[1]?.trim(); + signs[key] = { + text: text || null, + } } return signs;