diff --git a/src/components/map/Map.css b/src/components/map/Map.css index fa5f3c3..b89221a 100644 --- a/src/components/map/Map.css +++ b/src/components/map/Map.css @@ -49,6 +49,10 @@ stroke: #eee; } +.map svg g.extended-signal-icon g { + stroke: #eee; +} + .map svg g.route g { fill: #eee; } diff --git a/src/components/map/object-renderers/SignalExtendedRenderer.js b/src/components/map/object-renderers/SignalExtendedRenderer.js index 8e71590..d08f845 100644 --- a/src/components/map/object-renderers/SignalExtendedRenderer.js +++ b/src/components/map/object-renderers/SignalExtendedRenderer.js @@ -1,5 +1,5 @@ -import { ReactSVG } from 'react-svg' import AngleHelper from '../../../helpers/angleHelper'; +import SignalElementsEnums from '../../../model/signal-elements/enums'; export default function SignalExtendedRenderer(props) { const { object } = props; @@ -11,19 +11,11 @@ export default function SignalExtendedRenderer(props) { const anchor = upsideDown ? "start" : "end"; return ( - - - { - svg.setAttribute('width', '1mm'); - svg.setAttribute('height', '3.3mm'); - }} - /> + + + - + {object.getPrintableSignalName()} @@ -31,3 +23,135 @@ export default function SignalExtendedRenderer(props) { ); } + +function SignalIcon(props) { + const { object } = props; + + const halfBaseWidth = getHalfBaseWidth(object); + const headOff = getHeadOffset(object); + const poleLength = getPoleLength(object); + + return ( + + { getBase(halfBaseWidth) } + { getPole(poleLength, headOff) } + { getHead(object, poleLength, headOff) } + + ); +} + +function getHalfBaseWidth(object) { + const isDwarf = object.signal_elements.type === SignalElementsEnums.Type.DWARF; + const isDoubleDwarf = object.signal_elements.type === SignalElementsEnums.Type.DWARF_DOUBLE; + const isOverhead = object.signal_elements.headPosition === SignalElementsEnums.HeadPosition.OVERHEAD; + + if(isOverhead) return 0; + if(isDwarf) return 0.6; + if(isDoubleDwarf) return 1.2; + + return 0.4536; +} + +function getBase(halfBaseWidth) { + if(halfBaseWidth === 0) return null; + return ; +} + +function getHeadOffset(object) { + const headPos = object.signal_elements.headPosition; + + switch (headPos) { + case SignalElementsEnums.HeadPosition.STANDARD: + case SignalElementsEnums.HeadPosition.NO_POLE: + case SignalElementsEnums.HeadPosition.OVERHEAD: + default: + return 0; + case SignalElementsEnums.HeadPosition.LEFT: + return -0.4536; + case SignalElementsEnums.HeadPosition.RIGHT: + return 0.4536; + } +} + +function getPoleLength(object) { + const headPos = object.signal_elements.headPosition; + if(headPos === SignalElementsEnums.HeadPosition.NO_POLE) return 0; + return 2; +} + +function getPole(poleLength, headOff) { + if(!poleLength) return null; + + if(headOff) { + return ; + } + + return ; +} + +function getUnit(key, unitType, x, y) { + const r = 0.6; + const c = 0.4; + + const baseCircle = ; + + switch(unitType) { + case SignalElementsEnums.UnitType.RED: + return + {baseCircle} + + + case SignalElementsEnums.UnitType.YELLOW_LOWER: + case SignalElementsEnums.UnitType.YELLOW_UPPER: + case SignalElementsEnums.UnitType.DWARF_YELLOW_S13: + return + {baseCircle} + + + case SignalElementsEnums.UnitType.GREEN: + case SignalElementsEnums.UnitType.OLD_GREEN: + return + {baseCircle} + + + case SignalElementsEnums.UnitType.BLUE: + return + {baseCircle} + + + + case SignalElementsEnums.UnitType.WHITE: + return + {baseCircle} + + case SignalElementsEnums.UnitType.DWARF_W24: + return + {baseCircle} + + + default: + return + {baseCircle} + + + + } +} + +function getHead(object, poleLength, headOff) { + // TODO: overhead signals + const isDoubleDwarf = object.signal_elements.type === SignalElementsEnums.Type.DWARF_DOUBLE; + const unitsCount = object.signal_elements.units.length; + const units = []; + + const r = 0.6; + + for(let i = 0; i < unitsCount; i++) { + const unitType = object.signal_elements.units[i]; + const cx = isDoubleDwarf ? (i > 2 ? r : -r) : headOff; + const cy = -poleLength - r - i * r * 2 + (isDoubleDwarf && i > 2 ? 6 * r : 0); + units.push(getUnit(i, unitType, cx, cy)); + } + + return units; +} \ No newline at end of file diff --git a/src/components/map/object-renderers/SignalRenderer.js b/src/components/map/object-renderers/SignalRenderer.js index ee8453c..e5a2267 100644 --- a/src/components/map/object-renderers/SignalRenderer.js +++ b/src/components/map/object-renderers/SignalRenderer.js @@ -7,7 +7,7 @@ export default function SignalRenderer(props) { const { object } = props; const { extendedSignals } = useContext(SettingsContext); - if (extendedSignals) { + if (extendedSignals && object.signal_elements) { return ; } else { return ; diff --git a/src/model/signal-elements/enums.js b/src/model/signal-elements/enums.js index 1472424..b65cfac 100644 --- a/src/model/signal-elements/enums.js +++ b/src/model/signal-elements/enums.js @@ -11,6 +11,8 @@ const SignalElementsEnums = { STANDARD: 1, RIGHT: 2, LEFT: 3, + NO_POLE: 4, + OVERHEAD: 5, }, UnitType: { UNKNOWN: 0, diff --git a/src/model/signal-elements/parsers/common.js b/src/model/signal-elements/parsers/common.js index d417b64..998a872 100644 --- a/src/model/signal-elements/parsers/common.js +++ b/src/model/signal-elements/parsers/common.js @@ -99,7 +99,7 @@ export default class SignalElementsParserCommon { const index = start + i * step; if (index >= entries.length) break; - signs[i] = entries[index]?.trim(); + signs.push(entries[index]?.trim()); } return signs; diff --git a/src/model/signal-elements/parsers/eha-eri-dwarf-ps.js b/src/model/signal-elements/parsers/eha-eri-dwarf-ps.js index cf583a0..c624a86 100644 --- a/src/model/signal-elements/parsers/eha-eri-dwarf-ps.js +++ b/src/model/signal-elements/parsers/eha-eri-dwarf-ps.js @@ -18,7 +18,7 @@ export default class SignalElementsParserEhaEriDwarfPs { return new SignalElements( isDouble ? SignalElementsEnums.Type.DWARF_DOUBLE : SignalElementsEnums.Type.DWARF, - SignalElementsEnums.HeadPosition.STANDARD, + SignalElementsEnums.HeadPosition.NO_POLE, [mainUnits, secondaryUnits].flat(), SignalElementsEnums.BarType.NONE, SignalElementsParserCommon.getSigns(entries, 15, 1, 1) diff --git a/src/model/signal-elements/parsers/eha-eri-dwarf.js b/src/model/signal-elements/parsers/eha-eri-dwarf.js index de040db..f5eb037 100644 --- a/src/model/signal-elements/parsers/eha-eri-dwarf.js +++ b/src/model/signal-elements/parsers/eha-eri-dwarf.js @@ -15,7 +15,7 @@ export default class SignalElementsParserEhaEriDwarf { return new SignalElements( SignalElementsEnums.Type.DWARF, - SignalElementsEnums.HeadPosition.STANDARD, + SignalElementsEnums.HeadPosition.NO_POLE, SignalElementsParserCommon.getUnits(entries, 2, 3, 2), SignalElementsEnums.BarType.NONE, []