From 26319e4c5bfbee722c15b8e7ccca9b6127bb1cb8 Mon Sep 17 00:00:00 2001
From: Alejandro Acuña <alejandro.acuna@aluvisagrupo.com>
Date: Wed, 12 Mar 2025 13:54:13 +0000
Subject: [PATCH] ghy

---
 svgDevicesTest/maps/VigicatCUC.java |  245 +++++++++++++++++++++++++++++++++++++++++++-----
 1 files changed, 218 insertions(+), 27 deletions(-)

diff --git a/svgDevicesTest/maps/VigicatCUC.java b/svgDevicesTest/maps/VigicatCUC.java
index c3be5d8..52ea6f9 100644
--- a/svgDevicesTest/maps/VigicatCUC.java
+++ b/svgDevicesTest/maps/VigicatCUC.java
@@ -7,19 +7,20 @@
 import art.library.model.devices.signalsboard.SignalsBoard;
 import art.library.model.devices.signalsboard.status.SignalStatus;
 import art.library.model.devices.vms.asf.Asf;
+import art.library.model.devices.vms.asf.AsfStatus;
 import art.library.model.devices.vms.pvv.Pvv;
 import art.library.model.devices.vms.pvv.PvvAlarms;
 import art.library.model.devices.vms.pvv.PvvStatus;
 import com.kitfox.svg.*;
 import java.lang.reflect.Method;
-import java.util.*;
 import java.math.BigDecimal;
+import java.util.*;
 import java.util.stream.Stream;
 
 public class VigicatCUC extends DeviceGraphicsRuntime
 {
-    private static final double rowWidth = 6;
-
+   
+	private double rowHeightBetweenLines = 20;
 
     private final HashMap<SVGElement,Runnable> mapRunnableElements = new HashMap();
     private final HashMap<SVGElement, double[]> mapTopCoordinates = new HashMap();
@@ -30,8 +31,9 @@
         super(diagram);
     }
 
-    public void status()
-    {
+    public void status(){
+	
+		getElementsContainingField("art.loadglobalinfo").stream().forEach(this::loadGlobalInfo);
         getElementsContainingField("art.device").stream().forEach(this::refreshElement);
         getElementsContainingField("art.signal").stream().forEach(this::refreshElement);
         getElementsContainingField("art.signal.etd").stream().forEach(this::updateEtdNode);
@@ -63,18 +65,121 @@
         } catch (Exception e){}
     }
     
-    //<editor-fold defaultstate="collapsed" desc="ASF">
-    public void status(Asf svgDevice, SVGElement element)
-    {
-        DeviceStatus status = svgDevice.getDeviceStatus();
+    public void status(Asf svgDevice, SVGElement element) {
+        AsfStatus status = svgDevice.getDeviceStatus();
 
         SVGElement background = getChildContainingField(element, "art.id", "Background");
         SVGElement border = getChildContainingField(element, "art.id", "Border");
+        SVGElement alarm = getChildContainingField(element, "art.id", "Alarm");
+        SVGElement arrow = getChildContainingField(element, "art.id", "Arrow");
+        SVGElement cross = getChildContainingField(element, "art.id", "Cross");
+        SVGElement right = getChildContainingField(element, "art.id", "Right");
+        SVGElement left = getChildContainingField(element, "art.id", "Left");
+        SVGElement textBUS = getChildContainingField(element, "art.id", "textBUS");
+        SVGElement left_lane_closed = getChildContainingField(element, "art.id", "left-lane-closed");
 
         setAttribute(background, "fill", getGenericDualStatusColor(status.status)[0]);
         setAttribute(border, "stroke", getGenericDualStatusColor(status.status)[1]);
+
+        setAttribute(alarm, "display", "none", 999);
+        setAttribute(arrow, "display", "none", 999);
+        setAttribute(cross, "display", "none", 999);
+        setAttribute(right, "display", "none", 999);
+        setAttribute(left, "display", "none", 999);
+        setAttribute(textBUS, "display", "none", 999);
+
+        if (left_lane_closed != null)
+            setAttribute(left_lane_closed, "display", "none", 999);
+            
+        boolean knownStatus = status.status != DeviceStatus.STATUS_OFFLINE && status.status != DeviceStatus.STATUS_UNKNOWN;
+
+        if (knownStatus) {
+            setAttribute(arrow,   "display", status.state == AsfStatus.STATE_ARROW ? "inline" : "none", 999);
+            setAttribute(cross,   "display", status.state == AsfStatus.STATE_CROSS ? "inline" : "none", 999);
+            setAttribute(right,   "display", status.state == AsfStatus.STATE_RIGHT ? "inline" : "none", 999);
+            setAttribute(left,    "display", status.state == AsfStatus.STATE_LEFT  ? "inline" : "none", 999);
+            setAttribute(textBUS, "display", status.state == AsfStatus.STATE_BUS   ? "inline" : "none", 999);
+            
+            if(status.state == AsfStatus.STATE_S52_LEFT && left_lane_closed != null)
+             setAttribute(left_lane_closed, "display", "inline", 999);
+        }
+
+        String colorBackground = "#000000";
+        String colorAlarm = "#000000";
+
+        switch (status.status){
+            case DeviceStatus.STATUS_ALARM:
+                colorAlarm = "#FF0000";
+                break;
+            case DeviceStatus.STATUS_OFFLINE:
+            case DeviceStatus.STATUS_UNKNOWN:
+                colorBackground = "#FF00FF";
+                colorAlarm = "#800080";
+                break;
+         }
+
+         setAttribute(border, "stroke", colorAlarm, 999);
+         setAttribute(background, "fill", colorBackground, 999);
+
     }
 //</editor-fold>
+
+    //<editor-fold defaultstate="collapsed" desc="ASF">
+  /*  public void status(Asf svgDevice, SVGElement element) throws Exception{
+        AsfStatus status = svgDevice.getDeviceStatus();
+    
+        SVGElement alarm = getChildContainingField(element, "art.id", "Alarm");
+        SVGElement border = getChildContainingField(element, "art.id", "Border");
+        SVGElement background = getChildContainingField(element, "art.id", "Background");
+        SVGElement arrow = getChildContainingField(element, "art.id", "Arrow");
+        SVGElement cross = getChildContainingField(element, "art.id", "Cross");
+        SVGElement right = getChildContainingField(element, "art.id", "Right");
+        SVGElement left = getChildContainingField(element, "art.id", "Left");
+        SVGElement textBUS = getChildContainingField(element, "art.id", "textBUS");
+        SVGElement left_lane_closed = getChildContainingField(element, "art.id", "left-lane-closed");
+
+        setAttribute(alarm, "display", "none", 999);
+        setAttribute(arrow, "display", "none", 999);
+        setAttribute(cross, "display", "none", 999);
+        setAttribute(right, "display", "none", 999);
+        setAttribute(left, "display", "none", 999);
+        setAttribute(textBUS, "display", "none", 999);
+      
+        if(left_lane_closed != null)
+            setAttribute(left_lane_closed, "display", "none", 999);
+            
+        boolean knownStatus = status.status != DeviceStatus.STATUS_OFFLINE && status.status != DeviceStatus.STATUS_UNKNOWN;
+       
+        if (knownStatus) {
+            setAttribute(arrow,   "display", status.state == AsfStatus.STATE_ARROW ? "inline" : "none", 999);
+            setAttribute(cross,   "display", status.state == AsfStatus.STATE_CROSS ? "inline" : "none", 999);
+            setAttribute(right,   "display", status.state == AsfStatus.STATE_RIGHT ? "inline" : "none", 999);
+            setAttribute(left,    "display", status.state == AsfStatus.STATE_LEFT  ? "inline" : "none", 999);
+            setAttribute(textBUS, "display", status.state == AsfStatus.STATE_BUS   ? "inline" : "none", 999);
+            
+            if(status.state == AsfStatus.STATE_S52_LEFT && left_lane_closed != null)
+             setAttribute(left_lane_closed, "display", "inline", 999);
+        }
+
+        String colorBackground = "#000000";
+        String colorAlarm = "#000000";
+
+        switch (status.status){
+            case DeviceStatus.STATUS_ALARM:
+                colorAlarm = "#FF0000";
+                break;
+            case DeviceStatus.STATUS_OFFLINE:
+            case DeviceStatus.STATUS_UNKNOWN:
+                colorBackground = "#FFFFFF";
+                colorAlarm = "#800080";
+                break;
+         }
+
+         setAttribute(border, "stroke", colorAlarm, 999);
+         setAttribute(background, "fill", colorBackground, 999);
+      
+    }*/
+//</editor-fold>
    
     //<editor-fold defaultstate="collapsed" desc="SignalBoard">
     public void status(SignalsBoard svgDevice, SVGElement element)
@@ -86,7 +191,7 @@
         boolean hasAlarm = svgDevice.getAlarm(signal.name) > 0;
 
         setText(element, signalValueNumber.intValue() + "");
-        setAttribute(element, "fill", hasAlarm ? "#db3939" : "#78e678", 999);
+        setAttribute(element, "fill", hasAlarm ? "#db3939" : "#000000", 999);
         setAttribute(element, "fill-opacity", 1, 999);
     }
 //</editor-fold>
@@ -155,22 +260,106 @@
     private void updateSpeedColumn(SVGElement element)
     {
         try
-        {
+        {  
+            
              Pvv svgDevice = (Pvv) Shared.model.modelDevices.getDevice(getAttribute(element, "art.device"));
-     
-        if (!mapTopCoordinates.containsKey(element))
+             SignalsBoard signalsBoard = (SignalsBoard) Shared.model.modelDevices.getDevice(getAttribute(element, "art.algorithm"));
+
+             if (signalsBoard != null) 
+             {
+                SignalStatus signal = signalsBoard.getDeviceStatus().getSignal(getAttribute(element, "art.signal"));
+				SignalStatus signalAlgorithmState = signalsBoard.getDeviceStatus().getSignalInput("state-algorithm-dynamic");
+				if (signalAlgorithmState.value == null) signalAlgorithmState.value = "false";
+				boolean algorithmState = Boolean.parseBoolean(signalAlgorithmState.value);
+				if (signal != null)
+				{
+					boolean automatico = Boolean.parseBoolean(signal.value);
+					setAttribute(element, "fill", (automatico && algorithmState) ? "#e6d69040" : "#e0893351"); //si se fija la velocidad 
+				}
+			}
+
+             if (!mapTopCoordinates.containsKey(element))
+             {
+                 mapTopCoordinates.put(element, new double[]{element.getPresAbsolute("y").getDoubleValue() + rowHeightBetweenLines, element.getPresAbsolute("height").getDoubleValue()});
+             }
+        
+             double baseY = mapTopCoordinates.get(element)[0];
+        
+             final int speed = svgDevice.getDeviceStatus().speed;
+             final double verticalOffset = getVerticalOffset(element, speed);
+         
+             
+             Optional<SVGElement> lineElement1 = getElementsContainingField("art.speed.line").stream()
+                     .filter(val -> getAttribute(val, "art.signal").replace("-maximum-speed", "").equalsIgnoreCase(svgDevice.getIdentifier()))
+                     .findAny();
+             
+             String nominalSpeed = "";
+             
+             if(lineElement1.isPresent())
+             {
+                 SignalStatus signal = signalsBoard.getDeviceStatus().getSignal(getAttribute(lineElement1.get(), "art.signal"));
+                 nominalSpeed = signal.value;
+                 if (signal != null)
+                 {
+                     try
+                     {
+                         setAttribute(lineElement1.get(), "y1", getVerticalOffset(element, Integer.parseInt(signal.value)));
+                         setAttribute(lineElement1.get(), "y2", getVerticalOffset(element, Integer.parseInt(signal.value)));
+                         setAttribute(lineElement1.get(), "stroke", "#646a73");
+                         
+                         update(lineElement1.get());
+                     } 
+                     catch (Exception ex){}
+                 }
+             }
+        
+             Optional<SVGElement> lineElement2 = getElementsContainingField("art.speed.line").stream()
+                     .filter(val -> getAttribute(val, "art.signal").replace("-nominal-speed", "").equalsIgnoreCase(svgDevice.getIdentifier()))
+                     .findAny();
+             
+             if(lineElement2.isPresent())
+             {
+                 SignalStatus signal = signalsBoard.getDeviceStatus().getSignal(getAttribute(lineElement2.get(), "art.signal"));
+
+                 if (signal != null)
+                 {
+                     try
+                     {
+                         setAttribute(lineElement2.get(), "y1", getVerticalOffset(element, Integer.parseInt(signal.value)));
+                         setAttribute(lineElement2.get(), "y2", getVerticalOffset(element, Integer.parseInt(signal.value)));
+                         setAttribute(lineElement2.get(), "stroke", "#646a73");
+                      
+                         if(signal.value != null && signal.value.equals(nominalSpeed) == false)
+                         {
+                             setAttribute(lineElement1.get(), "stroke", "#fa0000");
+                         }
+                         
+                         update(lineElement2.get());
+                     } 
+                     catch (Exception ex){}
+                 }
+             }
+
+             setAttribute(element, "height", Math.abs(baseY - verticalOffset));
+             setAttribute(element, "y", verticalOffset);
+             update(element);
+        } 
+		catch (Exception ex)
         {
-            mapTopCoordinates.put(element, new double[]{element.getPresAbsolute("y").getDoubleValue() + rowWidth, element.getPresAbsolute("height").getDoubleValue()});
         }
-
-        double baseY = mapTopCoordinates.get(element)[0];
-
-        final int speed = svgDevice.getDeviceStatus().speed;
-        final double verticalOffset = getVerticalOffset(element, speed);
-
-        setAttribute(element, "height", Math.abs(baseY - verticalOffset));
-        setAttribute(element, "y", verticalOffset);
-        update(element);
+       
+    }
+	
+	private void loadGlobalInfo(SVGElement element)
+    {
+        try
+        {
+            
+			if("LineSpeedInfo".equals(getAttribute(element, "art.loadglobalinfo")))
+			{
+				rowHeightBetweenLines = Double.parseDouble(getAttribute(element, "art.heightbetweenlines"));
+			}
+			
         } catch (Exception ex)
         {
         }
@@ -178,6 +367,8 @@
     }
 //</editor-fold>
 
+
+
     //<editor-fold defaultstate="collapsed" desc="Etd's">
     private void updateEtdNode(SVGElement element)
     {
@@ -234,15 +425,15 @@
     {
         final double baseValue = mapTopCoordinates.get(element)[0];
 
-        return baseValue - (rowWidth * (value / 10));
+        return baseValue - (rowHeightBetweenLines * (value / 10));
     }
     
     private void updateNodeLinePosition(SVGElement element)
     {
         try
         {
-            String startNodeID = getAttribute(element, "art.node.start");
-            String endNodeID = getAttribute(element, "art.node.end");
+              String startNodeID = getAttribute(element, "art.node.start");
+              String endNodeID = getAttribute(element, "art.node.end");
 
         if (startNodeID != null && endNodeID != null)
         {
@@ -322,4 +513,4 @@
     
 
 
-}
+}
\ No newline at end of file

--
Gitblit v1.10.0