asd
Alejandro Acuña
2024-09-16 816cb391a192e357426312ab8e591fd49d1d242e
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,17 +65,120 @@
        } 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">
@@ -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>
@@ -156,11 +261,26 @@
    {
        try
        {
             Pvv svgDevice = (Pvv) Shared.model.modelDevices.getDevice(getAttribute(element, "art.device"));
             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() + rowWidth, element.getPresAbsolute("height").getDoubleValue()});
                 mapTopCoordinates.put(element, new double[]{element.getPresAbsolute("y").getDoubleValue() + rowHeightBetweenLines, element.getPresAbsolute("height").getDoubleValue()});
        }
        double baseY = mapTopCoordinates.get(element)[0];
@@ -168,9 +288,78 @@
        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)
        {
        }
    }
   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,7 +425,7 @@
    {
        final double baseValue = mapTopCoordinates.get(element)[0];
        return baseValue - (rowWidth * (value / 10));
        return baseValue - (rowHeightBetweenLines * (value / 10));
    }
    
    private void updateNodeLinePosition(SVGElement element)