diff --git a/public/assets/mech_signals/arm.svg b/public/assets/mech_signals/arm.svg new file mode 100644 index 0000000..406d0f5 --- /dev/null +++ b/public/assets/mech_signals/arm.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/public/assets/mech_signals/distant_arm.svg b/public/assets/mech_signals/distant_arm.svg new file mode 100644 index 0000000..9c8c35b --- /dev/null +++ b/public/assets/mech_signals/distant_arm.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/public/assets/mech_signals/distant_head.svg b/public/assets/mech_signals/distant_head.svg new file mode 100644 index 0000000..a4ba2ef --- /dev/null +++ b/public/assets/mech_signals/distant_head.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/public/assets/mech_signals/shunting_head.svg b/public/assets/mech_signals/shunting_head.svg new file mode 100644 index 0000000..55c90ab --- /dev/null +++ b/public/assets/mech_signals/shunting_head.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/public/assets/mech_signals/stop_head.svg b/public/assets/mech_signals/stop_head.svg new file mode 100644 index 0000000..d14af50 --- /dev/null +++ b/public/assets/mech_signals/stop_head.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/components/map/Map.css b/src/components/map/Map.css index 3916554..f99c711 100644 --- a/src/components/map/Map.css +++ b/src/components/map/Map.css @@ -91,6 +91,14 @@ fill: #111; } +.map svg g.signal-head-mech path { + fill: #eee; +} + +.map svg g.signal-head-mech path.background { + fill: #111; +} + .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 e5056d7..0b587d0 100644 --- a/src/components/map/object-renderers/SignalExtendedRenderer.js +++ b/src/components/map/object-renderers/SignalExtendedRenderer.js @@ -102,9 +102,11 @@ function getPolePoints(object, headOffsetX) { if(isDwarf) return null; const isOverhead = object.signal_elements.isOverhead(); + const isMechanical = object.signal_elements.isMechanical(); const polePoints = {}; polePoints.zigzag = headOffsetX !== 0 ? 0.4 : 0; + if(isMechanical) polePoints.zigzag += 3.5; polePoints.bars = polePoints.zigzag; switch(object.signal_elements.bar) { @@ -121,7 +123,9 @@ function getPolePoints(object, headOffsetX) { const signsHeight = Object.keys(object.signal_elements.signs).map(key => (DefinedSignalSigns[key]?.height || 1.0) + 0.2).reduce((a, b) => a + b, 0) || 0; polePoints.signs = polePoints.bars + signsHeight; - polePoints.end = isOverhead ? polePoints.signs : Math.max(polePoints.signs + 0.8, 2.2); + polePoints.end = polePoints.signs; + if(isMechanical) polePoints.end = Math.max(polePoints.end + 0.8, 6.0); + else if(!isOverhead) polePoints.end = Math.max(polePoints.signs + 0.8, 2.2); return polePoints; } @@ -186,6 +190,10 @@ function getUnit(key, unitType, x, y) { } function getHead(object, headOffsetY, headOffsetX) { + if(object.signal_elements.isMechanical()) { + return getHeadMech(object, headOffsetY); + } + if(object.signal_elements.type === SignalElementsEnums.Type.TOP) { return getHeadTOP(object, headOffsetY); } @@ -219,6 +227,67 @@ function getHeadTOP(object, headOffsetY) { } +function getHomeMechSignalArm(y, rot) { + return + { + svg.setAttribute('width', '1mm'); + svg.setAttribute('height', '1mm'); + }} + />; + ; +} + +function getCustomMechHead(y, fileName) { + return + { + svg.setAttribute('width', '1mm'); + svg.setAttribute('height', '1mm'); + }} + />; + ; +} + +function getHeadMech(object, headOffsetY) { + const mechType = object.signal_elements.mechType; + + switch(mechType) { + case SignalElementsEnums.MechType.HOME_SINGLE: + return + { getHomeMechSignalArm(headOffsetY, 0) } + + case SignalElementsEnums.MechType.HOME_DOUBLE: + return + { getHomeMechSignalArm(headOffsetY, 0) } + { getHomeMechSignalArm(headOffsetY + 3.5, -90) } + + case SignalElementsEnums.MechType.SHUNTING: + return + { getCustomMechHead(headOffsetY, 'shunting_head.svg') } + + case SignalElementsEnums.MechType.DISTANT_SINGLE: + return + { getCustomMechHead(headOffsetY, 'distant_head.svg') } + + case SignalElementsEnums.MechType.DISTANT_DOUBLE: + return + { getCustomMechHead(headOffsetY, 'distant_head.svg') } + { getCustomMechHead(headOffsetY + 3.5, 'distant_arm.svg') } + + case SignalElementsEnums.MechType.STOP: + return + { getCustomMechHead(headOffsetY, 'stop_head.svg') } + + default: + return null; + } +} + function getBar(object, headOffsetX, y, isYellow, key = 0) { const yellowOff = isYellow ? 0.2 : 0;