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;