diff --git a/src/components/map/object-renderers/SignalExtendedRenderer.js b/src/components/map/object-renderers/SignalExtendedRenderer.js index 6784cb9..3be672b 100644 --- a/src/components/map/object-renderers/SignalExtendedRenderer.js +++ b/src/components/map/object-renderers/SignalExtendedRenderer.js @@ -5,17 +5,19 @@ export default function SignalExtendedRenderer(props) { const { object } = props; const [x, y] = object.pos.toSVGCoords(); - const rot = AngleHelper.normalizeDegAngle(object.rot.y); + const overheadRot = object.signal_elements.isOverhead() ? 180 : 0; + const baseRot = object.rot.y; + const rot = AngleHelper.normalizeDegAngle(overheadRot + baseRot); const upsideDown = rot >= 180; const upsideDownRot = upsideDown ? 90 : -90; const anchor = upsideDown ? "start" : "end"; return ( - - + + - + {object.getPrintableSignalName()} @@ -28,25 +30,34 @@ function SignalIcon(props) { const { object } = props; const halfBaseWidth = getHalfBaseWidth(object); - const headOff = getHeadOffset(object); - const poleLength = getPoleLength(object, headOff); + const headOffsetX = getHeadOffsetX(object); + const poleLength = getPoleLength(object, headOffsetX); + const headOffsetY = getHeadOffsetY(object, poleLength); return ( { getBase(halfBaseWidth) } - { getPole(poleLength, headOff) } - { getBars(object, poleLength, headOff) } - { getHead(object, poleLength, headOff) } + { getOverheadFrame(object) } + { getPole(poleLength, headOffsetY, headOffsetX) } + { getBars(object, headOffsetY, headOffsetX) } + { getHead(object, headOffsetY, headOffsetX) } ); } +function getHeadOffsetY(object, poleLength) { + if(object.signal_elements.isOverhead()) { + return object.signal_elements.units.length * 1.2 + 0.1; + } + + return -poleLength; +} + 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(object.signal_elements.isOverhead()) return 0; if(isDwarf) return 0.6; if(isDoubleDwarf) return 1.2; @@ -58,7 +69,13 @@ function getBase(halfBaseWidth) { return ; } -function getHeadOffset(object) { +function getOverheadFrame(object) { + if(!object.signal_elements.isOverhead()) return null; + + return ; +} + +function getHeadOffsetX(object) { const isTOP = object.signal_elements.type === SignalElementsEnums.Type.TOP; if(isTOP) return 0; @@ -66,8 +83,8 @@ function getHeadOffset(object) { switch (headPos) { case SignalElementsEnums.HeadPosition.STANDARD: - case SignalElementsEnums.HeadPosition.NO_POLE: - case SignalElementsEnums.HeadPosition.OVERHEAD: + case SignalElementsEnums.HeadPosition.UNKNOWN: + case SignalElementsEnums.HeadPosition.DWARF: default: return 0; case SignalElementsEnums.HeadPosition.LEFT: @@ -77,39 +94,39 @@ function getHeadOffset(object) { } } -function getPoleLength(object, headOff) { - const headPos = object.signal_elements.headPosition; - if(headPos === SignalElementsEnums.HeadPosition.NO_POLE) return 0; +function getPoleLength(object, headOffsetX) { + const isOverhead = object.signal_elements.isOverhead(); - let length = 0.8; + let length = isOverhead ? 0 : 0.6; - if(headOff !== 0) { - length += 0.4; + if(headOffsetX !== 0) { + length += 0.4; // zigzag offset } switch(object.signal_elements.bar) { case SignalElementsEnums.BarType.YELLOW: case SignalElementsEnums.BarType.GREEN: - length += 1.0; + length += 0.7; break; case SignalElementsEnums.BarType.YELLOW_GREEN: - length += 1.8; + length += 1.5; break; default: break; } - return Math.max(length, 2); + if(isOverhead) return length; + return Math.max(length + 0.2, 2); } -function getPole(poleLength, headOff) { +function getPole(poleLength, headOffsetY, headOffsetX) { if(!poleLength) return null; - if(headOff) { - return ; + if(headOffsetX) { + return ; } - return ; + return ; } function getUnit(key, unitType, x, y) { @@ -161,12 +178,11 @@ function getUnit(key, unitType, x, y) { } } -function getHead(object, poleLength, headOff) { +function getHead(object, headOffsetY, headOffsetX) { if(object.signal_elements.type === SignalElementsEnums.Type.TOP) { - return getHeadTOP(object, poleLength); + return getHeadTOP(object, headOffsetY); } - // TODO: overhead signals const isDoubleDwarf = object.signal_elements.type === SignalElementsEnums.Type.DWARF_DOUBLE; const unitsCount = object.signal_elements.units.length; const units = []; @@ -174,41 +190,41 @@ function getHead(object, poleLength, headOff) { 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); + const cx = isDoubleDwarf ? (i > 2 ? r : -r) : headOffsetX; + const cy = headOffsetY - r - i * r * 2 + (isDoubleDwarf && i > 2 ? 6 * r : 0); units.push(getUnit(i, unitType, cx, cy)); } return units; } -function getHeadTOP(object, poleLength) { +function getHeadTOP(object, headOffsetY) { const isLeft = object.signal_elements.headPosition === SignalElementsEnums.HeadPosition.LEFT; const r = 0.6; const whiteCX = isLeft ? r*2 : -r*2; return <> - - { getUnit(0, SignalElementsEnums.UnitType.YELLOW_LOWER, 0, -poleLength-r) } - { getUnit(1, SignalElementsEnums.UnitType.WHITE, 0, -poleLength-3*r) } - { getUnit(2, SignalElementsEnums.UnitType.WHITE, 0, -poleLength-5*r) } - { getUnit(3, SignalElementsEnums.UnitType.YELLOW_LOWER, whiteCX, -poleLength-r) } + + { getUnit(0, SignalElementsEnums.UnitType.YELLOW_LOWER, 0, headOffsetY-r) } + { getUnit(1, SignalElementsEnums.UnitType.WHITE, 0, headOffsetY-3*r) } + { getUnit(2, SignalElementsEnums.UnitType.WHITE, 0, headOffsetY-5*r) } + { getUnit(3, SignalElementsEnums.UnitType.YELLOW_LOWER, whiteCX, headOffsetY-r) } } -function getBar(object, headOff, y, isYellow, key = 0) { +function getBar(object, headOffsetX, y, isYellow, key = 0) { const yellowOff = isYellow ? 0.2 : 0; return - ; - ; + ; + ; } -function getBars(object, poleLength, headOff) { +function getBars(object, headOffsetY, headOffsetX) { const barType = object.signal_elements.bar; - const headOffOffset = headOff !== 0 ? 0.4 : 0; - const y = -poleLength + headOffOffset + 0.6; + const zigzagOffset = headOffsetX !== 0 ? 0.4 : 0; + const y = headOffsetY + zigzagOffset + 0.6; if(barType === SignalElementsEnums.BarType.NONE) return null; @@ -226,4 +242,4 @@ function getBars(object, poleLength, headOff) { { getBar(object, 0, y + 0.8, true, 1) } } -} \ No newline at end of file +} diff --git a/src/model/defs/defined-switches.js b/src/model/defs/defined-switches.js index ff67be2..bbcc72a 100644 --- a/src/model/defs/defined-switches.js +++ b/src/model/defs/defined-switches.js @@ -280,6 +280,33 @@ const DefinedSwitches = { new Vector3(0, 0, 25.221), new Vector3(-1.667, 0, 25.111) ], + "Rz 60E1-2500-1_26.5 R": [ + 0, + -2500, + [0, 0, 3, 4], + new Vector3(0, 0, 0), + new Vector3(0, 0, 0), + new Vector3(0, 0, 94.306), + new Vector3(1.778, 0, 94.273) + ], + "Rz 60E1-2500-1_26.5 L": [ + 0, + 2500, + [0, 0, 3, 4], + new Vector3(0, 0, 0), + new Vector3(0, 0, 0), + new Vector3(0, 0, 94.306), + new Vector3(-1.778, 0, 94.273) + ], + "Rlds 60E1-600-600-1_18.5": [ + -600, + 600, + [0, 0, 3, 4], + new Vector3(0, 0, 0), + new Vector3(0, 0, 0), + new Vector3(0.92, 0, 33.206), + new Vector3(-0.92, 0, 33.206) + ], "Rlds 60E1-190-190-1_9": [ -190, 190, diff --git a/src/model/signal-elements/enums.js b/src/model/signal-elements/enums.js index b65cfac..33eeced 100644 --- a/src/model/signal-elements/enums.js +++ b/src/model/signal-elements/enums.js @@ -11,8 +11,7 @@ const SignalElementsEnums = { STANDARD: 1, RIGHT: 2, LEFT: 3, - NO_POLE: 4, - OVERHEAD: 5, + DWARF: 4, }, UnitType: { UNKNOWN: 0, diff --git a/src/model/signal-elements/parsers/common.js b/src/model/signal-elements/parsers/common.js index de78159..d657ed6 100644 --- a/src/model/signal-elements/parsers/common.js +++ b/src/model/signal-elements/parsers/common.js @@ -10,7 +10,6 @@ export default class SignalElementsParserCommon { static getHeadPosition(poleString) { const headPosition = this.getAfterLastUnderscoreNoVersion(poleString)?.[0]; - if (!headPosition) return SignalElementsEnums.HeadPosition.UNKNOWN; switch (headPosition) { case 'p': 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 c624a86..297f990 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.NO_POLE, + SignalElementsEnums.HeadPosition.DWARF, [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 f5eb037..99c2326 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.NO_POLE, + SignalElementsEnums.HeadPosition.DWARF, SignalElementsParserCommon.getUnits(entries, 2, 3, 2), SignalElementsEnums.BarType.NONE, [] diff --git a/src/model/signal-elements/parsers/sk-dwarf.js b/src/model/signal-elements/parsers/sk-dwarf.js index a9dcd89..f61fed9 100644 --- a/src/model/signal-elements/parsers/sk-dwarf.js +++ b/src/model/signal-elements/parsers/sk-dwarf.js @@ -14,7 +14,7 @@ export default class SignalElementsParserSkDwarf { return new SignalElements( SignalElementsEnums.Type.DWARF, - SignalElementsEnums.HeadPosition.NO_POLE, + SignalElementsEnums.HeadPosition.DWARF, SignalElementsParserCommon.getUnits(entries, 2, 2, 1), SignalElementsEnums.BarType.NONE, [] diff --git a/src/model/signal-elements/signal-elements.js b/src/model/signal-elements/signal-elements.js index 61b27f9..eef2075 100644 --- a/src/model/signal-elements/signal-elements.js +++ b/src/model/signal-elements/signal-elements.js @@ -19,6 +19,10 @@ export default class SignalElements { }); } + isOverhead() { + return this.headPosition === SignalElementsEnums.HeadPosition.UNKNOWN; + } + static fromPrefabText(id, text) { const prefabName = text.split(",", 2)[0].trim();