diff --git a/docs/_static/img/subnetworks.png b/docs/_static/img/subnetworks.png new file mode 100644 index 000000000..09c66d41a Binary files /dev/null and b/docs/_static/img/subnetworks.png differ diff --git a/docs/network_area_diagrams/index.md b/docs/network_area_diagrams/index.md index 911f92994..bbd5ade98 100644 --- a/docs/network_area_diagrams/index.md +++ b/docs/network_area_diagrams/index.md @@ -9,6 +9,7 @@ hidden: true layout/layout.md labelProvider/labelProvider.md +styleProvider/styleProvider.md ``` diff --git a/docs/network_area_diagrams/styleProvider/styleProvider.md b/docs/network_area_diagrams/styleProvider/styleProvider.md new file mode 100644 index 000000000..2f43c200f --- /dev/null +++ b/docs/network_area_diagrams/styleProvider/styleProvider.md @@ -0,0 +1,36 @@ +# Style provider + +The `StyleProvider` interface provides a way to customize the appearance of the network-area diagram. + +Regarding nodes and bus nodes, the color and the blinking is fully customizable. +Regarding edges, the color, the width, the stroke and the blinking is also fully customizable + +Currently, there are 2 implementations of the `StyleProvider`: the `NominalStyleProvider` and the `TopologicalStyleProvider` + +## Common features +The common features are factorized in the abstract classes `AbstractStyleProvider` and `AbstractVoltageStyleProvider`. + +### Overvoltage and undervoltage voltage levels +- Bus nodes which are over-voltage (meaning their voltage is above the voltage level high voltage limit) have their corresponding ring marked with class `nad-overvoltage`. +If default CSS is used, this leads to the corresponding ring stroke blinking in orange. +- Similarly, for bus nodes which are under-voltage (meaning their voltage is below the voltage level low voltage limit); they have their corresponding ring marked with class `nad-undervoltage`. +If default CSS is used, this leads to the corresponding ring stroke blinking in blue. + +### Overloaded lines +Branches which are overloaded are marked with class `nad-overload`. If default CSS is used, this leads to a branch yellow-blinking. + +### Subnetworks +The classes added by the style provider for the "highlight" graph duplicate are based on the subnetwork corresponding to each element. +With default CSS used, this leads to subnetworks being highlighted. +> Note: the `SvgParameters` attribute highlightGraph` needs to be set to `true`, so that the SvgWriter adds that simplified "highlight" graph duplicate, which contains only branches and voltage level nodes. + +![subnetworks](/_static/img/subnetworks.png) + + +## NominalStyleProvider feature +The voltage level nodes are marked with a class depending on their nominal voltage, leading to one colour for each range of nominal voltages defined by the BaseVoltagesConfig. + +## TopologicalStyleProvider feature +The bus nodes of a voltage level are each marked with a class depending on the nominal voltage and on their bus index. +This leads to a colour shading for each range of nominal voltages defined by the BaseVoltagesConfig. +The text node of corresponding voltage level gives a legend for the colour shading, based on the selected given `LabelProvider` - the default being the voltage and angle. diff --git a/network-area-diagram/src/main/java/com/powsybl/nad/svg/CustomStyleProvider.java b/network-area-diagram/src/main/java/com/powsybl/nad/svg/CustomStyleProvider.java index 3b9c4486f..2bde70902 100644 --- a/network-area-diagram/src/main/java/com/powsybl/nad/svg/CustomStyleProvider.java +++ b/network-area-diagram/src/main/java/com/powsybl/nad/svg/CustomStyleProvider.java @@ -7,10 +7,7 @@ */ package com.powsybl.nad.svg; -import com.powsybl.nad.model.BranchEdge; -import com.powsybl.nad.model.BusNode; -import com.powsybl.nad.model.Edge; -import com.powsybl.nad.model.ThreeWtEdge; +import com.powsybl.nad.model.*; import java.util.*; import java.util.stream.Collectors; @@ -142,6 +139,21 @@ public List getEdgeInfoStyleClasses(EdgeInfo info) { return styles; } + @Override + public List getHighlightNodeStyleClasses(Node node) { + return List.of(); + } + + @Override + public List getHighlightSideEdgeStyleClasses(BranchEdge edge, BranchEdge.Side side) { + return List.of(); + } + + @Override + public List getHighlightThreeWtEdgStyleClasses(ThreeWtEdge edge) { + return List.of(); + } + @Override protected boolean isDisconnected(ThreeWtEdge threeWtEdge) { return false; diff --git a/network-area-diagram/src/main/java/com/powsybl/nad/svg/StyleProvider.java b/network-area-diagram/src/main/java/com/powsybl/nad/svg/StyleProvider.java index 2759f5706..b11853e0f 100644 --- a/network-area-diagram/src/main/java/com/powsybl/nad/svg/StyleProvider.java +++ b/network-area-diagram/src/main/java/com/powsybl/nad/svg/StyleProvider.java @@ -1,5 +1,5 @@ /** - * Copyright (c) 2021, RTE (http://www.rte-france.com) + * Copyright (c) 2021-2025, RTE (http://www.rte-france.com) * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. @@ -42,6 +42,7 @@ public interface StyleProvider { String LABEL_BOX_CLASS = CLASSES_PREFIX + "label-box"; String LEGEND_SQUARE_CLASS = CLASSES_PREFIX + "legend-square"; String PST_ARROW_CLASS = CLASSES_PREFIX + "pst-arrow"; + String HIGHLIGHT_CLASS = CLASSES_PREFIX + "highlight"; List getCssFilenames(); @@ -49,16 +50,22 @@ public interface StyleProvider { List getNodeStyleClasses(Node node); + List getHighlightNodeStyleClasses(Node node); + List getBusNodeStyleClasses(BusNode busNode); List getBranchEdgeStyleClasses(BranchEdge branchEdge); List getSideEdgeStyleClasses(BranchEdge edge, BranchEdge.Side side); + List getHighlightSideEdgeStyleClasses(BranchEdge edge, BranchEdge.Side side); + List getEdgeInfoStyleClasses(EdgeInfo info); List getThreeWtEdgeStyleClasses(ThreeWtEdge threeWtedge); + List getHighlightThreeWtEdgStyleClasses(ThreeWtEdge edge); + default String getBusNodeStyle(BusNode busNode) { return null; } diff --git a/network-area-diagram/src/main/java/com/powsybl/nad/svg/SvgParameters.java b/network-area-diagram/src/main/java/com/powsybl/nad/svg/SvgParameters.java index d9d951508..4a6b070d7 100644 --- a/network-area-diagram/src/main/java/com/powsybl/nad/svg/SvgParameters.java +++ b/network-area-diagram/src/main/java/com/powsybl/nad/svg/SvgParameters.java @@ -1,5 +1,5 @@ /** - * Copyright (c) 2021, RTE (http://www.rte-france.com) + * Copyright (c) 2021-2025, RTE (http://www.rte-france.com) * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. @@ -55,7 +55,7 @@ public class SvgParameters { private EdgeInfoEnum edgeInfoDisplayed = EdgeInfoEnum.ACTIVE_POWER; private double pstArrowHeadSize = 8; private String undefinedValueSymbol = ""; - + private boolean highlightGraph; public enum CssLocation { INSERTED_IN_SVG, EXTERNAL_IMPORTED, EXTERNAL_NO_IMPORT @@ -491,4 +491,13 @@ public SvgParameters setUndefinedValueSymbol(String undefinedValueSymbol) { this.undefinedValueSymbol = undefinedValueSymbol; return this; } + + public boolean isHighlightGraph() { + return highlightGraph; + } + + public SvgParameters setHighlightGraph(boolean highlightGraph) { + this.highlightGraph = highlightGraph; + return this; + } } diff --git a/network-area-diagram/src/main/java/com/powsybl/nad/svg/SvgWriter.java b/network-area-diagram/src/main/java/com/powsybl/nad/svg/SvgWriter.java index a0eb8f7d2..9470a3541 100644 --- a/network-area-diagram/src/main/java/com/powsybl/nad/svg/SvgWriter.java +++ b/network-area-diagram/src/main/java/com/powsybl/nad/svg/SvgWriter.java @@ -1,5 +1,5 @@ /** - * Copyright (c) 2021, RTE (http://www.rte-france.com) + * Copyright (c) 2021-2025, RTE (http://www.rte-france.com) * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. @@ -45,6 +45,7 @@ public class SvgWriter { private static final String TABLE_ELEMENT_NAME = "table"; private static final String TABLE_ROW_ELEMENT_NAME = "tr"; private static final String TABLE_DATA_ELEMENT_NAME = "td"; + private static final String USE_ELEMENT_NAME = "use"; private static final String ID_ATTRIBUTE = "id"; private static final String WIDTH_ATTRIBUTE = "width"; private static final String HEIGHT_ATTRIBUTE = "height"; @@ -59,6 +60,7 @@ public class SvgWriter { private static final String Y_ATTRIBUTE = "y"; private static final String DY_ATTRIBUTE = "dy"; private static final String POINTS_ATTRIBUTE = "points"; + private static final String HREF_ATTRIBUTE = "href"; private final SvgParameters svgParameters; private final StyleProvider styleProvider; @@ -105,18 +107,31 @@ private void writeSvg(Graph graph, OutputStream svgOs) { XMLStreamWriter writer = XmlUtil.initializeWriter(true, INDENT, svgOs); addSvgRoot(graph, writer); addStyle(writer); + if (this.svgParameters.isHighlightGraph()) { + drawHighlightedSection(graph, writer); + } drawVoltageLevelNodes(graph, writer); drawBranchEdges(graph, writer); drawThreeWtEdges(graph, writer); drawThreeWtNodes(graph, writer); drawTextEdges(graph, writer); drawTextNodes(graph, writer); + writer.writeEndDocument(); } catch (XMLStreamException e) { throw new UncheckedXmlStreamException(e); } } + private void drawHighlightedSection(Graph graph, XMLStreamWriter writer) throws XMLStreamException { + writer.writeStartElement(GROUP_ELEMENT_NAME); + writer.writeAttribute(CLASS_ATTRIBUTE, StyleProvider.HIGHLIGHT_CLASS); + drawHighlightVoltageLevelNodes(graph, writer); + drawHighlightBranchEdges(graph, writer); + drawHighlightThreeWtEdges(graph, writer); + writer.writeEndElement(); + } + private void drawBranchEdges(Graph graph, XMLStreamWriter writer) throws XMLStreamException { writer.writeStartElement(GROUP_ELEMENT_NAME); writer.writeAttribute(CLASS_ATTRIBUTE, StyleProvider.BRANCH_EDGES_CLASS); @@ -125,17 +140,24 @@ private void drawBranchEdges(Graph graph, XMLStreamWriter writer) throws XMLStre writeId(writer, edge); writeStyleClasses(writer, styleProvider.getBranchEdgeStyleClasses(edge)); insertName(writer, edge::getName); - drawHalfEdge(graph, writer, edge, BranchEdge.Side.ONE); drawHalfEdge(graph, writer, edge, BranchEdge.Side.TWO); - drawEdgeCenter(writer, edge); - writer.writeEndElement(); } writer.writeEndElement(); } + private void drawHighlightBranchEdges(Graph graph, XMLStreamWriter writer) throws XMLStreamException { + writer.writeStartElement(GROUP_ELEMENT_NAME); + writer.writeAttribute(CLASS_ATTRIBUTE, StyleProvider.BRANCH_EDGES_CLASS); + for (BranchEdge edge : graph.getBranchEdges()) { + drawHighlightHalfEdge(graph, writer, edge, BranchEdge.Side.ONE); + drawHighlightHalfEdge(graph, writer, edge, BranchEdge.Side.TWO); + } + writer.writeEndElement(); + } + private void drawEdgeLabel(XMLStreamWriter writer, BranchEdge edge) throws XMLStreamException { String edgeLabel = labelProvider.getLabel(edge); @@ -244,6 +266,20 @@ private void drawThreeWtEdges(Graph graph, XMLStreamWriter writer) throws XMLStr writer.writeEndElement(); } + private void drawHighlightThreeWtEdges(Graph graph, XMLStreamWriter writer) throws XMLStreamException { + List threeWtEdges = graph.getThreeWtEdges(); + if (threeWtEdges.isEmpty()) { + return; + } + + writer.writeStartElement(GROUP_ELEMENT_NAME); + writer.writeAttribute(CLASS_ATTRIBUTE, StyleProvider.THREE_WT_EDGES_CLASS); + for (ThreeWtEdge edge : threeWtEdges) { + drawHighlightThreeWtEdge(writer, edge); + } + writer.writeEndElement(); + } + private void drawHalfEdge(Graph graph, XMLStreamWriter writer, BranchEdge edge, BranchEdge.Side side) throws XMLStreamException { // the half edge is only drawn if visible, but if the edge is a TwoWtEdge, the transformer is still drawn if (!edge.isVisible(side) && !(edge.isTransformerEdge())) { @@ -255,26 +291,46 @@ private void drawHalfEdge(Graph graph, XMLStreamWriter writer, BranchEdge edge, if (edge.isVisible(side)) { Optional edgeInfo = labelProvider.getEdgeInfo(graph, edge, side); if (!graph.isLoop(edge)) { - writer.writeEmptyElement(POLYLINE_ELEMENT_NAME); - writeStyleClasses(writer, StyleProvider.EDGE_PATH_CLASS); - writeStyleAttribute(writer, styleProvider.getSideEdgeStyle(edge, side)); - writer.writeAttribute(POINTS_ATTRIBUTE, getPolylinePointsString(edge, side)); - if (edgeInfo.isPresent()) { - drawBranchEdgeInfo(graph, writer, edge, side, edgeInfo.get()); - } + drawHalfEdge(graph, writer, edge, side, edgeInfo.orElse(null)); } else { - writer.writeEmptyElement(PATH_ELEMENT_NAME); - writer.writeAttribute(CLASS_ATTRIBUTE, StyleProvider.EDGE_PATH_CLASS); - writer.writeAttribute(PATH_D_ATTRIBUTE, getLoopPathString(edge, side)); - writeStyleAttribute(writer, styleProvider.getSideEdgeStyle(edge, side)); - if (edgeInfo.isPresent()) { - drawLoopEdgeInfo(writer, edge, side, edgeInfo.get()); - } + drawLoopEdge(writer, edge, side, edgeInfo.orElse(null)); } } writer.writeEndElement(); } + private void drawHalfEdge(Graph graph, XMLStreamWriter writer, BranchEdge edge, BranchEdge.Side side, EdgeInfo edgeInfo) throws XMLStreamException { + writer.writeEmptyElement(POLYLINE_ELEMENT_NAME); + writeStyleClasses(writer, StyleProvider.EDGE_PATH_CLASS); + writeStyleAttribute(writer, styleProvider.getSideEdgeStyle(edge, side)); + writer.writeAttribute(POINTS_ATTRIBUTE, getPolylinePointsString(edge, side)); + if (edgeInfo != null) { + drawBranchEdgeInfo(graph, writer, edge, side, edgeInfo); + } + } + + private void drawHighlightHalfEdge(Graph graph, XMLStreamWriter writer, BranchEdge edge, BranchEdge.Side side) throws XMLStreamException { + if (edge.isVisible(side) && !graph.isLoop(edge)) { + drawHighlightHalfEdge(writer, edge, side); + } + } + + private void drawHighlightHalfEdge(XMLStreamWriter writer, BranchEdge edge, BranchEdge.Side side) throws XMLStreamException { + writer.writeEmptyElement(POLYLINE_ELEMENT_NAME); + writeStyleClasses(writer, styleProvider.getHighlightSideEdgeStyleClasses(edge, side)); + writer.writeAttribute(POINTS_ATTRIBUTE, getPolylinePointsString(edge, side)); + } + + private void drawLoopEdge(XMLStreamWriter writer, BranchEdge edge, BranchEdge.Side side, EdgeInfo edgeInfo) throws XMLStreamException { + writer.writeEmptyElement(PATH_ELEMENT_NAME); + writer.writeAttribute(CLASS_ATTRIBUTE, StyleProvider.EDGE_PATH_CLASS); + writer.writeAttribute(PATH_D_ATTRIBUTE, getLoopPathString(edge, side)); + writeStyleAttribute(writer, styleProvider.getSideEdgeStyle(edge, side)); + if (edgeInfo != null) { + drawLoopEdgeInfo(writer, edge, side, edgeInfo); + } + } + private String getPolylinePointsString(BranchEdge edge, BranchEdge.Side side) { return getPolylinePointsString(edge.getPoints(side)); } @@ -302,7 +358,6 @@ private void drawThreeWtEdge(Graph graph, XMLStreamWriter writer, ThreeWtEdge ed writeId(writer, edge); writeStyleClasses(writer, styleProvider.getThreeWtEdgeStyleClasses(edge)); insertName(writer, edge::getName); - writer.writeEmptyElement(POLYLINE_ELEMENT_NAME); writeStyleClasses(writer, StyleProvider.EDGE_PATH_CLASS); writeStyleAttribute(writer, styleProvider.getThreeWtEdgeStyle(edge)); @@ -312,7 +367,18 @@ private void drawThreeWtEdge(Graph graph, XMLStreamWriter writer, ThreeWtEdge ed if (edgeInfo.isPresent()) { drawThreeWtEdgeInfo(graph, writer, edge, edgeInfo.get()); } + writer.writeEndElement(); + } + private void drawHighlightThreeWtEdge(XMLStreamWriter writer, ThreeWtEdge edge) throws XMLStreamException { + if (!edge.isVisible()) { + return; + } + writer.writeStartElement(GROUP_ELEMENT_NAME); + writeStyleClasses(writer, styleProvider.getThreeWtEdgeStyleClasses(edge)); + writer.writeEmptyElement(POLYLINE_ELEMENT_NAME); + writeStyleClasses(writer, styleProvider.getHighlightThreeWtEdgStyleClasses(edge)); + writer.writeAttribute(POINTS_ATTRIBUTE, getPolylinePointsString(edge)); writer.writeEndElement(); } @@ -553,6 +619,22 @@ private void drawVoltageLevelNodes(Graph graph, XMLStreamWriter writer) throws X writer.writeEndElement(); } + private void drawHighlightVoltageLevelNodes(Graph graph, XMLStreamWriter writer) throws XMLStreamException { + writer.writeStartElement(GROUP_ELEMENT_NAME); + writer.writeAttribute(CLASS_ATTRIBUTE, StyleProvider.VOLTAGE_LEVEL_NODES_CLASS); + for (VoltageLevelNode vlNode : graph.getVoltageLevelNodesStream().filter(VoltageLevelNode::isVisible).collect(Collectors.toList())) { + drawHighlightedNode(writer, vlNode); + } + writer.writeEndElement(); + } + + private void drawHighlightedNode(XMLStreamWriter writer, VoltageLevelNode vlNode) throws XMLStreamException { + writer.writeStartElement(USE_ELEMENT_NAME); + writer.writeAttribute(HREF_ATTRIBUTE, "#" + getPrefixedId(vlNode.getDiagramId())); + writeStyleClasses(writer, styleProvider.getHighlightNodeStyleClasses(vlNode)); + writer.writeEndElement(); + } + private void drawTextNodes(Graph graph, XMLStreamWriter writer) throws XMLStreamException { writer.writeStartElement(GROUP_ELEMENT_NAME); writer.writeAttribute(CLASS_ATTRIBUTE, StyleProvider.TEXT_NODES_CLASS); diff --git a/network-area-diagram/src/main/java/com/powsybl/nad/svg/iidm/AbstractVoltageStyleProvider.java b/network-area-diagram/src/main/java/com/powsybl/nad/svg/iidm/AbstractVoltageStyleProvider.java index 137d6331c..a1193e04e 100644 --- a/network-area-diagram/src/main/java/com/powsybl/nad/svg/iidm/AbstractVoltageStyleProvider.java +++ b/network-area-diagram/src/main/java/com/powsybl/nad/svg/iidm/AbstractVoltageStyleProvider.java @@ -1,5 +1,5 @@ /** - * Copyright (c) 2022, RTE (http://www.rte-france.com) + * Copyright (c) 2022-2025, RTE (http://www.rte-france.com) * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. @@ -11,7 +11,10 @@ import com.powsybl.iidm.network.Bus; import com.powsybl.iidm.network.Network; import com.powsybl.iidm.network.Terminal; +import com.powsybl.iidm.network.ThreeSides; +import com.powsybl.iidm.network.TwoSides; import com.powsybl.nad.model.*; +import com.powsybl.nad.model.BranchEdge.Side; import com.powsybl.nad.svg.AbstractStyleProvider; import com.powsybl.nad.svg.StyleProvider; import com.powsybl.nad.utils.iidm.IidmUtils; @@ -24,14 +27,17 @@ public abstract class AbstractVoltageStyleProvider extends AbstractStyleProvider { protected final Network network; + private final Map subnetworksHighlightMap = new HashMap<>(); protected AbstractVoltageStyleProvider(Network network) { this.network = network; + buildSubnetworkMaps(); } protected AbstractVoltageStyleProvider(Network network, BaseVoltagesConfig baseVoltageStyle) { super(baseVoltageStyle); this.network = network; + buildSubnetworkMaps(); } @Override @@ -108,4 +114,47 @@ protected Optional getBaseVoltageStyle(BranchEdge edge, BranchEdge.Side } protected abstract Optional getBaseVoltageStyle(Terminal terminal); + + @Override + public List getHighlightNodeStyleClasses(Node node) { + String subnetworkId = network.getIdentifiable(node.getEquipmentId()).getParentNetwork().getId(); + return List.of(subnetworksHighlightMap.get(subnetworkId)); + } + + @Override + public List getHighlightSideEdgeStyleClasses(BranchEdge edge, BranchEdge.Side side) { + return getSubnetworkId(edge, side).map(id -> List.of(subnetworksHighlightMap.get(id))).orElse(Collections.emptyList()); + } + + @Override + public List getHighlightThreeWtEdgStyleClasses(ThreeWtEdge edge) { + String subnetworkId = getSubnetworkId(edge.getEquipmentId(), edge.getSide()); + return List.of(subnetworksHighlightMap.get(subnetworkId)); + } + + private Optional getSubnetworkId(BranchEdge edge, Side side) { + final TwoSides iidmSide = IidmUtils.getIidmSideFromBranchEdgeSide(side); + Terminal terminal = switch (edge.getType()) { + case BranchEdge.LINE_EDGE -> network.getLine(edge.getEquipmentId()).getTerminal(iidmSide); + case BranchEdge.TWO_WT_EDGE, BranchEdge.PST_EDGE -> network.getTwoWindingsTransformer(edge.getEquipmentId()).getTerminal(iidmSide); + case BranchEdge.DANGLING_LINE_EDGE -> network.getDanglingLine(edge.getEquipmentId()).getTerminal(); + case BranchEdge.TIE_LINE_EDGE -> network.getTieLine(edge.getEquipmentId()).getTerminal(iidmSide); + case BranchEdge.HVDC_LINE_EDGE -> network.getHvdcLine(edge.getEquipmentId()).getConverterStation(iidmSide).getTerminal(); + default -> null; + }; + return Optional.ofNullable(terminal).map(t -> t.getVoltageLevel().getParentNetwork().getId()); + } + + private String getSubnetworkId(String id, ThreeWtEdge.Side side) { + return network.getThreeWindingsTransformer(id).getLeg(ThreeSides.valueOf(side.name())).getTerminal().getVoltageLevel().getParentNetwork().getId(); + } + + private void buildSubnetworkMaps() { + network.getSubnetworks().forEach(n -> subnetworksHighlightMap.put(n.getId(), getHighlightClass(subnetworksHighlightMap.size()))); + } + + private String getHighlightClass(int index) { + return StyleProvider.HIGHLIGHT_CLASS + "-" + index % 5; + } + } diff --git a/network-area-diagram/src/main/resources/nominalStyle.css b/network-area-diagram/src/main/resources/nominalStyle.css index 3b996f571..5bbc225c9 100644 --- a/network-area-diagram/src/main/resources/nominalStyle.css +++ b/network-area-diagram/src/main/resources/nominalStyle.css @@ -27,7 +27,12 @@ path.nad-arrow-in:not(.nad-state-in .nad-arrow-in) {visibility: hidden} .nad-branch-edges .nad-overload .nad-edge-path {animation: line-blink 3s infinite} .nad-vl-nodes .nad-overvoltage {animation: node-over-blink 3s infinite} .nad-vl-nodes .nad-undervoltage {animation: node-under-blink 3s infinite} - +.nad-highlight {stroke-width: 25; opacity: 0.2; fill: none;} +.nad-highlight-0 {stroke: #e6e600;} +.nad-highlight-1 {stroke: #b300b3;} +.nad-highlight-2 {stroke: #2eb82e;} +.nad-highlight-3 {stroke: #e67300;} +.nad-highlight-4 {stroke: #0000ff;} @keyframes line-blink { 0%, 80%, 100% {stroke: var(--nad-vl-color, black); stroke-width: 5} 40% {stroke: #FFEB3B; stroke-width: 15} diff --git a/network-area-diagram/src/main/resources/topologicalStyle.css b/network-area-diagram/src/main/resources/topologicalStyle.css index 6f4e9f59c..1ac56594b 100644 --- a/network-area-diagram/src/main/resources/topologicalStyle.css +++ b/network-area-diagram/src/main/resources/topologicalStyle.css @@ -92,7 +92,12 @@ path.nad-arrow-in:not(.nad-state-in .nad-arrow-in) {visibility: hidden} .nad-branch-edges .nad-overload .nad-edge-path {animation: line-blink 3s infinite} .nad-vl-nodes .nad-overvoltage {animation: node-over-blink 3s infinite} .nad-vl-nodes .nad-undervoltage {animation: node-under-blink 3s infinite} - +.nad-highlight {stroke-width: 25; opacity: 0.2; fill: none;} +.nad-highlight-0 {stroke: #e6e600;} +.nad-highlight-1 {stroke: #b300b3;} +.nad-highlight-2 {stroke: #2eb82e;} +.nad-highlight-3 {stroke: #e67300;} +.nad-highlight-4 {stroke: #0000ff;} @keyframes line-blink { 0%, 80%, 100% {stroke: var(--nad-vl-color, black); stroke-width: 5} 40% {stroke: #FFEB3B; stroke-width: 15} diff --git a/network-area-diagram/src/test/java/com/powsybl/nad/svg/OverridingStyleTest.java b/network-area-diagram/src/test/java/com/powsybl/nad/svg/OverridingStyleTest.java index 05841a649..711ef54df 100644 --- a/network-area-diagram/src/test/java/com/powsybl/nad/svg/OverridingStyleTest.java +++ b/network-area-diagram/src/test/java/com/powsybl/nad/svg/OverridingStyleTest.java @@ -81,6 +81,7 @@ protected LabelProvider getLabelProvider(Network network) { void testEurope() { Network network = Network.read("simple-eu.uct", getClass().getResourceAsStream("/simple-eu.uct")); assertSvgEquals("/simple-eu_overridden_styles.svg", network); + assertSvgEquals("/simple-eu_overridden_styles.svg", network); } @Test diff --git a/network-area-diagram/src/test/java/com/powsybl/nad/svg/SubnetworkHighlightTest.java b/network-area-diagram/src/test/java/com/powsybl/nad/svg/SubnetworkHighlightTest.java new file mode 100644 index 000000000..058b8c109 --- /dev/null +++ b/network-area-diagram/src/test/java/com/powsybl/nad/svg/SubnetworkHighlightTest.java @@ -0,0 +1,495 @@ +/** + * Copyright (c) 2025, RTE (http://www.rte-france.com) + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * SPDX-License-Identifier: MPL-2.0 + */ +package com.powsybl.nad.svg; + +import com.google.common.jimfs.Configuration; +import com.google.common.jimfs.Jimfs; +import com.powsybl.iidm.network.*; +import com.powsybl.iidm.network.test.EurostagTutorialExample1Factory; +import com.powsybl.nad.AbstractTest; +import com.powsybl.nad.build.iidm.VoltageLevelFilter; +import com.powsybl.nad.layout.LayoutParameters; +import com.powsybl.nad.svg.iidm.DefaultLabelProvider; +import com.powsybl.nad.svg.iidm.NominalVoltageStyleProvider; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.time.ZonedDateTime; + +class SubnetworkHighlightTest extends AbstractTest { + + protected java.nio.file.FileSystem fileSystem; + + @BeforeEach + void setup() { + fileSystem = Jimfs.newFileSystem(Configuration.unix()); + setLayoutParameters(new LayoutParameters()); + setSvgParameters(new SvgParameters() + .setSvgWidthAndHeightAdded(true) + .setFixedWidth(800) + .setHighlightGraph(true)); + } + + @Override + protected StyleProvider getStyleProvider(Network network) { + return new NominalVoltageStyleProvider(network); + } + + @Override + protected LabelProvider getLabelProvider(Network network) { + return new DefaultLabelProvider(network, getSvgParameters()) { + }; + } + + @Test + void testSubnetworkHighlight() { + Network network = createWithTieLines(); + assertSvgEquals("/subnetwork_highlight.svg", network); + } + + @Test + void testPartialGraphSubnetworkHighlight() { + Network network = createWithTieLines(); + assertSvgEquals("/partial_graph_subnetwork_highlight.svg", network, VoltageLevelFilter.createVoltageLevelDepthFilter(network, "VLHV2", 1)); + } + + public static Network createWithTieLines() { + Network network = createWithLFResults(NetworkFactory.findDefault()); + network.getLine(EurostagTutorialExample1Factory.NHV1_NHV2_1).remove(); + network.getLine(EurostagTutorialExample1Factory.NHV1_NHV2_2).remove(); + + DanglingLine nhv1xnode1 = network.getVoltageLevel(EurostagTutorialExample1Factory.VLHV1) + .newDanglingLine() + .setId(EurostagTutorialExample1Factory.DANGLING_LINE_XNODE1_1) + .setP0(0.0) + .setQ0(0.0) + .setR(1.5) + .setX(20.0) + .setG(1E-6) + .setB(386E-6 / 2) + .setPairingKey(EurostagTutorialExample1Factory.XNODE_1) + .setBus(EurostagTutorialExample1Factory.NHV1) + .add(); + DanglingLine xnode1nhv2 = network.getVoltageLevel(EurostagTutorialExample1Factory.VLHV2) + .newDanglingLine() + .setId(EurostagTutorialExample1Factory.DANGLING_LINE_XNODE1_2) + .setP0(0.0) + .setQ0(0.0) + .setR(1.5) + .setX(13.0) + .setG(2E-6) + .setB(386E-6 / 2) + .setBus("NHV2") + .setPairingKey(EurostagTutorialExample1Factory.XNODE_1) + .add(); + network.newTieLine() + .setId(EurostagTutorialExample1Factory.NHV1_NHV2_1) + .setDanglingLine1(nhv1xnode1.getId()) + .setDanglingLine2(xnode1nhv2.getId()) + .add(); + network.getVoltageLevel(EurostagTutorialExample1Factory.VLHV1) + .newDanglingLine() + .setId(EurostagTutorialExample1Factory.DANGLING_LINE_XNODE2_1) + .setP0(0.0) + .setQ0(0.0) + .setR(1.5) + .setX(20.0) + .setG(1E-6) + .setB(386E-6 / 2) + .setBus(EurostagTutorialExample1Factory.NHV1) + .setPairingKey("XNODE2") + .add(); + network.getVoltageLevel(EurostagTutorialExample1Factory.VLHV2) + .newDanglingLine() + .setId(EurostagTutorialExample1Factory.DANGLING_LINE_XNODE2_2) + .setP0(0.0) + .setQ0(0.0) + .setR(1.5) + .setX(13.0) + .setG(2E-6) + .setB(386E-6 / 2) + .setBus("NHV2") + .setPairingKey("XNODE2") + .add(); + + network.getTieLine(EurostagTutorialExample1Factory.NHV1_NHV2_1).getDanglingLine1().getTerminal() + .setP(302.4440612792969) + .setQ(98.74027252197266); + + network.getTieLine(EurostagTutorialExample1Factory.NHV1_NHV2_1).getDanglingLine2().getTerminal() + .setP(-300.43389892578125) + .setQ(-137.18849182128906); + + return network; + } + + public static Network createWithLFResults(NetworkFactory factory) { + Network network = createwith3wt(factory); + network.setCaseDate(ZonedDateTime.parse("2013-01-15T18:45:00.000+01:00")); + network.getBusBreakerView().getBus(EurostagTutorialExample1Factory.NGEN) + .setV(24.500000610351563) + .setAngle(2.3259763717651367); + network.getBusBreakerView().getBus(EurostagTutorialExample1Factory.NHV1) + .setV(402.1428451538086) + .setAngle(0.0); + network.getBusBreakerView().getBus("NHV2") + .setV(389.9526763916016) + .setAngle(-3.5063576698303223); + network.getBusBreakerView().getBus("NLOAD") + .setV(147.57861328125) + .setAngle(-9.614486694335938); + + network.getBusBreakerView().getBus("BUS_3") + .setV(197.57861328125) + .setAngle(3.0); + + network.getBusBreakerView().getBus("BUS_4") + .setV(197.57861328125) + .setAngle(3.0); + + network.getBusBreakerView().getBus("BUS_5") + .setV(197.57861328125) + .setAngle(3.0); + + network.getGenerator("GEN").getTerminal() + .setP(-605.558349609375) + .setQ(-225.2825164794922); + network.getTwoWindingsTransformer(EurostagTutorialExample1Factory.NGEN_NHV1).getTerminal1() + .setP(605.558349609375) + .setQ(225.2825164794922); + network.getTwoWindingsTransformer(EurostagTutorialExample1Factory.NGEN_NHV1).getTerminal2() + .setP(-604.8909301757812) + .setQ(-197.48046875); + network.getLoad("LOAD").getTerminal() + .setP(600.0) + .setQ(200.0); + network.getTwoWindingsTransformer(EurostagTutorialExample1Factory.NHV2_NLOAD).getTerminal1() + .setP(600.8677978515625) + .setQ(274.3769836425781); + network.getTwoWindingsTransformer(EurostagTutorialExample1Factory.NHV2_NLOAD).getTerminal2() + .setP(-600.0) + .setQ(-200.0); + network.getLine(EurostagTutorialExample1Factory.NHV1_NHV2_1).getTerminal1() + .setP(302.4440612792969) + .setQ(98.74027252197266); + network.getLine(EurostagTutorialExample1Factory.NHV1_NHV2_1).getTerminal2() + .setP(-300.43389892578125) + .setQ(-137.18849182128906); + network.getLine(EurostagTutorialExample1Factory.NHV1_NHV2_2).getTerminal1() + .setP(302.4440612792969) + .setQ(98.74027252197266); + network.getLine(EurostagTutorialExample1Factory.NHV1_NHV2_2).getTerminal2() + .setP(-300.43389892578125) + .setQ(-137.188491821289060); + + return network; + } + + public static Network createwith3wt(NetworkFactory networkFactory) { + Network network0 = networkFactory.createNetwork("sim1", "test"); + Network network1 = network0.createSubnetwork("sub1", "subnetwork1", "test"); + Network network2 = network0.createSubnetwork("sub2", "subnetwork2", "test"); + Network network3 = network0.createSubnetwork("sub3", "subnetwork3", "test"); + + Substation p1 = network1.newSubstation() + .setId("P1") + .setCountry(Country.FR) + .setTso("RTE") + .setGeographicalTags("A") + .add(); + Substation p2 = network2.newSubstation() + .setId("P2") + .setCountry(Country.FR) + .setTso("RTE") + .setGeographicalTags("B") + .add(); + Substation p3 = network3.newSubstation() + .setId("P3") + .setCountry(Country.FR) + .setTso("RTE") + .setGeographicalTags("B") + .add(); + VoltageLevel vlgen = p1.newVoltageLevel() + .setId(EurostagTutorialExample1Factory.VLGEN) + .setNominalV(24.0) + .setTopologyKind(TopologyKind.BUS_BREAKER) + .add(); + VoltageLevel vlhv1 = p1.newVoltageLevel() + .setId(EurostagTutorialExample1Factory.VLHV1) + .setNominalV(380.0) + .setTopologyKind(TopologyKind.BUS_BREAKER) + .add(); + VoltageLevel vlhv2 = p2.newVoltageLevel() + .setId(EurostagTutorialExample1Factory.VLHV2) + .setNominalV(380.0) + .setTopologyKind(TopologyKind.BUS_BREAKER) + .add(); + VoltageLevel vlload = p2.newVoltageLevel() + .setId(EurostagTutorialExample1Factory.VLLOAD) + .setNominalV(150.0) + .setTopologyKind(TopologyKind.BUS_BREAKER) + .add(); + Bus ngen = vlgen.getBusBreakerView().newBus() + .setId(EurostagTutorialExample1Factory.NGEN) + .add(); + Bus nhv1 = vlhv1.getBusBreakerView().newBus() + .setId(EurostagTutorialExample1Factory.NHV1) + .add(); + Bus nhv2 = vlhv2.getBusBreakerView().newBus() + .setId("NHV2") + .add(); + Bus nload = vlload.getBusBreakerView().newBus() + .setId("NLOAD") + .add(); + + VoltageLevel vlhv3 = p3.newVoltageLevel() + .setId("VLHV3") + .setNominalV(380.0) + .setTopologyKind(TopologyKind.BUS_BREAKER) + .add(); + VoltageLevel vlhv4 = p3.newVoltageLevel() + .setId("VLHV4") + .setNominalV(380.0) + .setTopologyKind(TopologyKind.BUS_BREAKER) + .add(); + VoltageLevel vlhv5 = p3.newVoltageLevel() + .setId("VLHV5") + .setNominalV(380.0) + .setTopologyKind(TopologyKind.BUS_BREAKER) + .add(); + Bus bus3 = vlhv3.getBusBreakerView().newBus() + .setId("BUS_3") + .add(); + bus3.setV(197.57861328125).setAngle(3.0); + + Bus bus4 = vlhv4.getBusBreakerView().newBus() + .setId("BUS_4") + .add(); + bus4.setV(197.57861328125).setAngle(3.0); + + Bus bus5 = vlhv5.getBusBreakerView().newBus() + .setId("BUS_5") + .add(); + bus5.setV(197.57861328125).setAngle(3.0); + + network0.newLine() + .setId(EurostagTutorialExample1Factory.NHV1_NHV2_1) + .setVoltageLevel1(vlhv1.getId()) + .setBus1(nhv1.getId()) + .setConnectableBus1(nhv1.getId()) + .setVoltageLevel2(vlhv2.getId()) + .setBus2(nhv2.getId()) + .setConnectableBus2(nhv2.getId()) + .setR(3.0) + .setX(33.0) + .setG1(0.0) + .setB1(386E-6 / 2) + .setG2(0.0) + .setB2(386E-6 / 2) + .add(); + network0.newLine() + .setId(EurostagTutorialExample1Factory.NHV1_NHV2_2) + .setVoltageLevel1(vlhv1.getId()) + .setBus1(nhv1.getId()) + .setConnectableBus1(nhv1.getId()) + .setVoltageLevel2(vlhv2.getId()) + .setBus2(nhv2.getId()) + .setConnectableBus2(nhv2.getId()) + .setR(3.0) + .setX(33.0) + .setG1(0.0) + .setB1(386E-6 / 2) + .setG2(0.0) + .setB2(386E-6 / 2) + .add(); + + network0.newLine() + .setId("NHV2_NHV2_3") + .setVoltageLevel1(vlhv2.getId()) + .setBus1(nhv2.getId()) + .setConnectableBus1(nhv2.getId()) + .setVoltageLevel2(vlhv3.getId()) + .setBus2(bus3.getId()) + .setConnectableBus2(bus3.getId()) + .setR(3.0) + .setX(33.0) + .setG1(0.0) + .setB1(386E-6 / 2) + .setG2(0.0) + .setB2(386E-6 / 2) + .add(); + int zb380 = 380 * 380 / 100; + p1.newTwoWindingsTransformer() + .setId(EurostagTutorialExample1Factory.NGEN_NHV1) + .setVoltageLevel1(vlgen.getId()) + .setBus1(ngen.getId()) + .setConnectableBus1(ngen.getId()) + .setRatedU1(24.0) + .setVoltageLevel2(vlhv1.getId()) + .setBus2(nhv1.getId()) + .setConnectableBus2(nhv1.getId()) + .setRatedU2(400.0) + .setR(0.24 / 1300 * zb380) + .setX(Math.sqrt(10 * 10 - 0.24 * 0.24) / 1300 * zb380) + .setG(0.0) + .setB(0.0) + .add(); + int zb150 = 150 * 150 / 100; + TwoWindingsTransformer nhv2Nload = p2.newTwoWindingsTransformer() + .setId(EurostagTutorialExample1Factory.NHV2_NLOAD) + .setVoltageLevel1(vlhv2.getId()) + .setBus1(nhv2.getId()) + .setConnectableBus1(nhv2.getId()) + .setRatedU1(400.0) + .setVoltageLevel2(vlload.getId()) + .setBus2(nload.getId()) + .setConnectableBus2(nload.getId()) + .setRatedU2(158.0) + .setR(0.21 / 1000 * zb150) + .setX(Math.sqrt(18 * 18 - 0.21 * 0.21) / 1000 * zb150) + .setG(0.0) + .setB(0.0) + .add(); + double a = (158.0 / 150.0) / (400.0 / 380.0); + nhv2Nload.newRatioTapChanger() + .beginStep() + .setRho(0.85f * a) + .setR(0.0) + .setX(0.0) + .setG(0.0) + .setB(0.0) + .endStep() + .beginStep() + .setRho(a) + .setR(0.0) + .setX(0.0) + .setG(0.0) + .setB(0.0) + .endStep() + .beginStep() + .setRho(1.15f * a) + .setR(0.0) + .setX(0.0) + .setG(0.0) + .setB(0.0) + .endStep() + .setTapPosition(1) + .setLoadTapChangingCapabilities(true) + .setRegulating(true) + .setRegulationMode(RatioTapChanger.RegulationMode.VOLTAGE) + .setRegulationValue(158.0) + .setTargetDeadband(0) + .setRegulationTerminal(nhv2Nload.getTerminal2()) + .add(); + vlload.newLoad() + .setId("LOAD") + .setBus(nload.getId()) + .setConnectableBus(nload.getId()) + .setP0(600.0) + .setQ0(200.0) + .add(); + Generator generator = vlgen.newGenerator() + .setId("GEN") + .setBus(ngen.getId()) + .setConnectableBus(ngen.getId()) + .setMinP(-9999.99) + .setMaxP(9999.99) + .setVoltageRegulatorOn(true) + .setTargetV(24.5) + .setTargetP(607.0) + .setTargetQ(301.0) + .add(); + generator.newMinMaxReactiveLimits() + .setMinQ(-9999.99) + .setMaxQ(9999.99) + .add(); + + p3.newThreeWindingsTransformer() + .setId("3WT") + .setRatedU0(132.0) + .newLeg1() + .setR(17.424) + .setX(1.7424) + .setG(0.00573921028466483) + .setB(0.000573921028466483) + .setRatedU(132.0) + .setVoltageLevel(vlhv5.getId()) + .setBus(bus5.getId()) + .add() + .newLeg2() + .setR(1.089) + .setX(0.1089) + .setG(0.0) + .setB(0.0) + .setRatedU(33.0) + .setVoltageLevel(vlhv3.getId()) + .setBus(bus3.getId()) + .add() + .newLeg3() + .setR(0.121) + .setX(0.0121) + .setG(0.0) + .setB(0.0) + .setRatedU(11.0) + .setVoltageLevel(vlhv4.getId()) + .setBus(bus4.getId()) + .add() + .add(); + + VscConverterStation cs1 = vlhv3.newVscConverterStation() + .setId("C1") + .setName("Converter1") + .setConnectableBus("BUS_3") + .setBus("BUS_3") + .setLossFactor(1.1f) + .setVoltageSetpoint(405.0) + .setVoltageRegulatorOn(true) + .add(); + cs1.getTerminal() + .setP(100.0) + .setQ(50.0); + cs1.newReactiveCapabilityCurve() + .beginPoint() + .setP(5.0) + .setMinQ(0.0) + .setMaxQ(10.0) + .endPoint() + .beginPoint() + .setP(10.0) + .setMinQ(0.0) + .setMaxQ(10.0) + .endPoint() + .add(); + VscConverterStation cs2 = vlload.newVscConverterStation() + .setId("C2") + .setName("Converter2") + .setBus(nload.getId()) + .setLossFactor(1.1f) + .setReactivePowerSetpoint(123) + .setVoltageRegulatorOn(false) + .setRegulatingTerminal(cs1.getTerminal()) + .add(); + cs2.newMinMaxReactiveLimits() + .setMinQ(0.0) + .setMaxQ(10.0) + .add(); + + network0.newHvdcLine() + .setId("L") + .setName("HVDC") + .setConverterStationId1("C1") + .setConverterStationId2("C2") + .setR(1) + .setNominalV(400) + .setConvertersMode(HvdcLine.ConvertersMode.SIDE_1_INVERTER_SIDE_2_RECTIFIER) + .setMaxP(300.0) + .setActivePowerSetpoint(280) + .add(); + return network0; + } +} diff --git a/network-area-diagram/src/test/resources/3wt.svg b/network-area-diagram/src/test/resources/3wt.svg index 28bf60db4..e60b16869 100644 --- a/network-area-diagram/src/test/resources/3wt.svg +++ b/network-area-diagram/src/test/resources/3wt.svg @@ -30,7 +30,12 @@ path.nad-arrow-in:not(.nad-state-in .nad-arrow-in) {visibility: hidden} .nad-branch-edges .nad-overload .nad-edge-path {animation: line-blink 3s infinite} .nad-vl-nodes .nad-overvoltage {animation: node-over-blink 3s infinite} .nad-vl-nodes .nad-undervoltage {animation: node-under-blink 3s infinite} - +.nad-highlight {stroke-width: 25; opacity: 0.2; fill: none;} +.nad-highlight-0 {stroke: #e6e600;} +.nad-highlight-1 {stroke: #b300b3;} +.nad-highlight-2 {stroke: #2eb82e;} +.nad-highlight-3 {stroke: #e67300;} +.nad-highlight-4 {stroke: #0000ff;} @keyframes line-blink { 0%, 80%, 100% {stroke: var(--nad-vl-color, black); stroke-width: 5} 40% {stroke: #FFEB3B; stroke-width: 15} diff --git a/network-area-diagram/src/test/resources/3wt_disconnected.svg b/network-area-diagram/src/test/resources/3wt_disconnected.svg index b8a7486da..54e4006eb 100644 --- a/network-area-diagram/src/test/resources/3wt_disconnected.svg +++ b/network-area-diagram/src/test/resources/3wt_disconnected.svg @@ -30,7 +30,12 @@ path.nad-arrow-in:not(.nad-state-in .nad-arrow-in) {visibility: hidden} .nad-branch-edges .nad-overload .nad-edge-path {animation: line-blink 3s infinite} .nad-vl-nodes .nad-overvoltage {animation: node-over-blink 3s infinite} .nad-vl-nodes .nad-undervoltage {animation: node-under-blink 3s infinite} - +.nad-highlight {stroke-width: 25; opacity: 0.2; fill: none;} +.nad-highlight-0 {stroke: #e6e600;} +.nad-highlight-1 {stroke: #b300b3;} +.nad-highlight-2 {stroke: #2eb82e;} +.nad-highlight-3 {stroke: #e67300;} +.nad-highlight-4 {stroke: #0000ff;} @keyframes line-blink { 0%, 80%, 100% {stroke: var(--nad-vl-color, black); stroke-width: 5} 40% {stroke: #FFEB3B; stroke-width: 15} diff --git a/network-area-diagram/src/test/resources/3wt_disconnected_topological.svg b/network-area-diagram/src/test/resources/3wt_disconnected_topological.svg index 6afaf12ae..139df6aa4 100644 --- a/network-area-diagram/src/test/resources/3wt_disconnected_topological.svg +++ b/network-area-diagram/src/test/resources/3wt_disconnected_topological.svg @@ -95,7 +95,12 @@ path.nad-arrow-in:not(.nad-state-in .nad-arrow-in) {visibility: hidden} .nad-branch-edges .nad-overload .nad-edge-path {animation: line-blink 3s infinite} .nad-vl-nodes .nad-overvoltage {animation: node-over-blink 3s infinite} .nad-vl-nodes .nad-undervoltage {animation: node-under-blink 3s infinite} - +.nad-highlight {stroke-width: 25; opacity: 0.2; fill: none;} +.nad-highlight-0 {stroke: #e6e600;} +.nad-highlight-1 {stroke: #b300b3;} +.nad-highlight-2 {stroke: #2eb82e;} +.nad-highlight-3 {stroke: #e67300;} +.nad-highlight-4 {stroke: #0000ff;} @keyframes line-blink { 0%, 80%, 100% {stroke: var(--nad-vl-color, black); stroke-width: 5} 40% {stroke: #FFEB3B; stroke-width: 15} diff --git a/network-area-diagram/src/test/resources/3wt_metadata.json b/network-area-diagram/src/test/resources/3wt_metadata.json index f5ce11369..1dc024668 100644 --- a/network-area-diagram/src/test/resources/3wt_metadata.json +++ b/network-area-diagram/src/test/resources/3wt_metadata.json @@ -53,7 +53,8 @@ "currentValuePrecision" : 0, "edgeInfoDisplayed" : "ACTIVE_POWER", "pstArrowHeadSize" : 8.0, - "undefinedValueSymbol" : "" + "undefinedValueSymbol" : "", + "highlightGraph" : false }, "busNodes" : [ { "svgId" : "1", diff --git a/network-area-diagram/src/test/resources/3wt_overridden_styles.svg b/network-area-diagram/src/test/resources/3wt_overridden_styles.svg index 08fe4f0b7..fe103adb3 100644 --- a/network-area-diagram/src/test/resources/3wt_overridden_styles.svg +++ b/network-area-diagram/src/test/resources/3wt_overridden_styles.svg @@ -95,7 +95,12 @@ path.nad-arrow-in:not(.nad-state-in .nad-arrow-in) {visibility: hidden} .nad-branch-edges .nad-overload .nad-edge-path {animation: line-blink 3s infinite} .nad-vl-nodes .nad-overvoltage {animation: node-over-blink 3s infinite} .nad-vl-nodes .nad-undervoltage {animation: node-under-blink 3s infinite} - +.nad-highlight {stroke-width: 25; opacity: 0.2; fill: none;} +.nad-highlight-0 {stroke: #e6e600;} +.nad-highlight-1 {stroke: #b300b3;} +.nad-highlight-2 {stroke: #2eb82e;} +.nad-highlight-3 {stroke: #e67300;} +.nad-highlight-4 {stroke: #0000ff;} @keyframes line-blink { 0%, 80%, 100% {stroke: var(--nad-vl-color, black); stroke-width: 5} 40% {stroke: #FFEB3B; stroke-width: 15} diff --git a/network-area-diagram/src/test/resources/3wt_partial.svg b/network-area-diagram/src/test/resources/3wt_partial.svg index cfc6ccb52..e82e91781 100644 --- a/network-area-diagram/src/test/resources/3wt_partial.svg +++ b/network-area-diagram/src/test/resources/3wt_partial.svg @@ -30,7 +30,12 @@ path.nad-arrow-in:not(.nad-state-in .nad-arrow-in) {visibility: hidden} .nad-branch-edges .nad-overload .nad-edge-path {animation: line-blink 3s infinite} .nad-vl-nodes .nad-overvoltage {animation: node-over-blink 3s infinite} .nad-vl-nodes .nad-undervoltage {animation: node-under-blink 3s infinite} - +.nad-highlight {stroke-width: 25; opacity: 0.2; fill: none;} +.nad-highlight-0 {stroke: #e6e600;} +.nad-highlight-1 {stroke: #b300b3;} +.nad-highlight-2 {stroke: #2eb82e;} +.nad-highlight-3 {stroke: #e67300;} +.nad-highlight-4 {stroke: #0000ff;} @keyframes line-blink { 0%, 80%, 100% {stroke: var(--nad-vl-color, black); stroke-width: 5} 40% {stroke: #FFEB3B; stroke-width: 15} diff --git a/network-area-diagram/src/test/resources/3wt_pst.svg b/network-area-diagram/src/test/resources/3wt_pst.svg index 2f65e70bd..d868e677a 100644 --- a/network-area-diagram/src/test/resources/3wt_pst.svg +++ b/network-area-diagram/src/test/resources/3wt_pst.svg @@ -30,7 +30,12 @@ path.nad-arrow-in:not(.nad-state-in .nad-arrow-in) {visibility: hidden} .nad-branch-edges .nad-overload .nad-edge-path {animation: line-blink 3s infinite} .nad-vl-nodes .nad-overvoltage {animation: node-over-blink 3s infinite} .nad-vl-nodes .nad-undervoltage {animation: node-under-blink 3s infinite} - +.nad-highlight {stroke-width: 25; opacity: 0.2; fill: none;} +.nad-highlight-0 {stroke: #e6e600;} +.nad-highlight-1 {stroke: #b300b3;} +.nad-highlight-2 {stroke: #2eb82e;} +.nad-highlight-3 {stroke: #e67300;} +.nad-highlight-4 {stroke: #0000ff;} @keyframes line-blink { 0%, 80%, 100% {stroke: var(--nad-vl-color, black); stroke-width: 5} 40% {stroke: #FFEB3B; stroke-width: 15} diff --git a/network-area-diagram/src/test/resources/IEEE_118_bus.svg b/network-area-diagram/src/test/resources/IEEE_118_bus.svg index b128a6fa7..3ca0b7df8 100644 --- a/network-area-diagram/src/test/resources/IEEE_118_bus.svg +++ b/network-area-diagram/src/test/resources/IEEE_118_bus.svg @@ -95,7 +95,12 @@ path.nad-arrow-in:not(.nad-state-in .nad-arrow-in) {visibility: hidden} .nad-branch-edges .nad-overload .nad-edge-path {animation: line-blink 3s infinite} .nad-vl-nodes .nad-overvoltage {animation: node-over-blink 3s infinite} .nad-vl-nodes .nad-undervoltage {animation: node-under-blink 3s infinite} - +.nad-highlight {stroke-width: 25; opacity: 0.2; fill: none;} +.nad-highlight-0 {stroke: #e6e600;} +.nad-highlight-1 {stroke: #b300b3;} +.nad-highlight-2 {stroke: #2eb82e;} +.nad-highlight-3 {stroke: #e67300;} +.nad-highlight-4 {stroke: #0000ff;} @keyframes line-blink { 0%, 80%, 100% {stroke: var(--nad-vl-color, black); stroke-width: 5} 40% {stroke: #FFEB3B; stroke-width: 15} diff --git a/network-area-diagram/src/test/resources/IEEE_118_bus_partial.svg b/network-area-diagram/src/test/resources/IEEE_118_bus_partial.svg index da6d73b01..d97dd8be4 100644 --- a/network-area-diagram/src/test/resources/IEEE_118_bus_partial.svg +++ b/network-area-diagram/src/test/resources/IEEE_118_bus_partial.svg @@ -95,7 +95,12 @@ path.nad-arrow-in:not(.nad-state-in .nad-arrow-in) {visibility: hidden} .nad-branch-edges .nad-overload .nad-edge-path {animation: line-blink 3s infinite} .nad-vl-nodes .nad-overvoltage {animation: node-over-blink 3s infinite} .nad-vl-nodes .nad-undervoltage {animation: node-under-blink 3s infinite} - +.nad-highlight {stroke-width: 25; opacity: 0.2; fill: none;} +.nad-highlight-0 {stroke: #e6e600;} +.nad-highlight-1 {stroke: #b300b3;} +.nad-highlight-2 {stroke: #2eb82e;} +.nad-highlight-3 {stroke: #e67300;} +.nad-highlight-4 {stroke: #0000ff;} @keyframes line-blink { 0%, 80%, 100% {stroke: var(--nad-vl-color, black); stroke-width: 5} 40% {stroke: #FFEB3B; stroke-width: 15} diff --git a/network-area-diagram/src/test/resources/IEEE_118_bus_partial_non_connected.svg b/network-area-diagram/src/test/resources/IEEE_118_bus_partial_non_connected.svg index c38423631..6b9e67f3f 100644 --- a/network-area-diagram/src/test/resources/IEEE_118_bus_partial_non_connected.svg +++ b/network-area-diagram/src/test/resources/IEEE_118_bus_partial_non_connected.svg @@ -95,7 +95,12 @@ path.nad-arrow-in:not(.nad-state-in .nad-arrow-in) {visibility: hidden} .nad-branch-edges .nad-overload .nad-edge-path {animation: line-blink 3s infinite} .nad-vl-nodes .nad-overvoltage {animation: node-over-blink 3s infinite} .nad-vl-nodes .nad-undervoltage {animation: node-under-blink 3s infinite} - +.nad-highlight {stroke-width: 25; opacity: 0.2; fill: none;} +.nad-highlight-0 {stroke: #e6e600;} +.nad-highlight-1 {stroke: #b300b3;} +.nad-highlight-2 {stroke: #2eb82e;} +.nad-highlight-3 {stroke: #e67300;} +.nad-highlight-4 {stroke: #0000ff;} @keyframes line-blink { 0%, 80%, 100% {stroke: var(--nad-vl-color, black); stroke-width: 5} 40% {stroke: #FFEB3B; stroke-width: 15} diff --git a/network-area-diagram/src/test/resources/IEEE_14_bus.svg b/network-area-diagram/src/test/resources/IEEE_14_bus.svg index 0e193aba5..8c7772435 100644 --- a/network-area-diagram/src/test/resources/IEEE_14_bus.svg +++ b/network-area-diagram/src/test/resources/IEEE_14_bus.svg @@ -30,7 +30,12 @@ path.nad-arrow-in:not(.nad-state-in .nad-arrow-in) {visibility: hidden} .nad-branch-edges .nad-overload .nad-edge-path {animation: line-blink 3s infinite} .nad-vl-nodes .nad-overvoltage {animation: node-over-blink 3s infinite} .nad-vl-nodes .nad-undervoltage {animation: node-under-blink 3s infinite} - +.nad-highlight {stroke-width: 25; opacity: 0.2; fill: none;} +.nad-highlight-0 {stroke: #e6e600;} +.nad-highlight-1 {stroke: #b300b3;} +.nad-highlight-2 {stroke: #2eb82e;} +.nad-highlight-3 {stroke: #e67300;} +.nad-highlight-4 {stroke: #0000ff;} @keyframes line-blink { 0%, 80%, 100% {stroke: var(--nad-vl-color, black); stroke-width: 5} 40% {stroke: #FFEB3B; stroke-width: 15} diff --git a/network-area-diagram/src/test/resources/IEEE_14_bus_disconnection.svg b/network-area-diagram/src/test/resources/IEEE_14_bus_disconnection.svg index 54a291f18..466569a70 100644 --- a/network-area-diagram/src/test/resources/IEEE_14_bus_disconnection.svg +++ b/network-area-diagram/src/test/resources/IEEE_14_bus_disconnection.svg @@ -30,7 +30,12 @@ path.nad-arrow-in:not(.nad-state-in .nad-arrow-in) {visibility: hidden} .nad-branch-edges .nad-overload .nad-edge-path {animation: line-blink 3s infinite} .nad-vl-nodes .nad-overvoltage {animation: node-over-blink 3s infinite} .nad-vl-nodes .nad-undervoltage {animation: node-under-blink 3s infinite} - +.nad-highlight {stroke-width: 25; opacity: 0.2; fill: none;} +.nad-highlight-0 {stroke: #e6e600;} +.nad-highlight-1 {stroke: #b300b3;} +.nad-highlight-2 {stroke: #2eb82e;} +.nad-highlight-3 {stroke: #e67300;} +.nad-highlight-4 {stroke: #0000ff;} @keyframes line-blink { 0%, 80%, 100% {stroke: var(--nad-vl-color, black); stroke-width: 5} 40% {stroke: #FFEB3B; stroke-width: 15} diff --git a/network-area-diagram/src/test/resources/IEEE_14_bus_fictitious.svg b/network-area-diagram/src/test/resources/IEEE_14_bus_fictitious.svg index baea6a8d4..93a0e5fb5 100644 --- a/network-area-diagram/src/test/resources/IEEE_14_bus_fictitious.svg +++ b/network-area-diagram/src/test/resources/IEEE_14_bus_fictitious.svg @@ -30,7 +30,12 @@ path.nad-arrow-in:not(.nad-state-in .nad-arrow-in) {visibility: hidden} .nad-branch-edges .nad-overload .nad-edge-path {animation: line-blink 3s infinite} .nad-vl-nodes .nad-overvoltage {animation: node-over-blink 3s infinite} .nad-vl-nodes .nad-undervoltage {animation: node-under-blink 3s infinite} - +.nad-highlight {stroke-width: 25; opacity: 0.2; fill: none;} +.nad-highlight-0 {stroke: #e6e600;} +.nad-highlight-1 {stroke: #b300b3;} +.nad-highlight-2 {stroke: #2eb82e;} +.nad-highlight-3 {stroke: #e67300;} +.nad-highlight-4 {stroke: #0000ff;} @keyframes line-blink { 0%, 80%, 100% {stroke: var(--nad-vl-color, black); stroke-width: 5} 40% {stroke: #FFEB3B; stroke-width: 15} diff --git a/network-area-diagram/src/test/resources/IEEE_14_bus_fictitious_metadata.json b/network-area-diagram/src/test/resources/IEEE_14_bus_fictitious_metadata.json index f417f20a1..b735a1568 100644 --- a/network-area-diagram/src/test/resources/IEEE_14_bus_fictitious_metadata.json +++ b/network-area-diagram/src/test/resources/IEEE_14_bus_fictitious_metadata.json @@ -53,7 +53,8 @@ "currentValuePrecision" : 0, "edgeInfoDisplayed" : "ACTIVE_POWER", "pstArrowHeadSize" : 8.0, - "undefinedValueSymbol" : "" + "undefinedValueSymbol" : "", + "highlightGraph" : false }, "busNodes" : [ { "svgId" : "1", diff --git a/network-area-diagram/src/test/resources/IEEE_14_bus_text_nodes.svg b/network-area-diagram/src/test/resources/IEEE_14_bus_text_nodes.svg index 81c6636a9..c6f314fb4 100644 --- a/network-area-diagram/src/test/resources/IEEE_14_bus_text_nodes.svg +++ b/network-area-diagram/src/test/resources/IEEE_14_bus_text_nodes.svg @@ -30,7 +30,12 @@ path.nad-arrow-in:not(.nad-state-in .nad-arrow-in) {visibility: hidden} .nad-branch-edges .nad-overload .nad-edge-path {animation: line-blink 3s infinite} .nad-vl-nodes .nad-overvoltage {animation: node-over-blink 3s infinite} .nad-vl-nodes .nad-undervoltage {animation: node-under-blink 3s infinite} - +.nad-highlight {stroke-width: 25; opacity: 0.2; fill: none;} +.nad-highlight-0 {stroke: #e6e600;} +.nad-highlight-1 {stroke: #b300b3;} +.nad-highlight-2 {stroke: #2eb82e;} +.nad-highlight-3 {stroke: #e67300;} +.nad-highlight-4 {stroke: #0000ff;} @keyframes line-blink { 0%, 80%, 100% {stroke: var(--nad-vl-color, black); stroke-width: 5} 40% {stroke: #FFEB3B; stroke-width: 15} diff --git a/network-area-diagram/src/test/resources/IEEE_14_bus_voltage_filter1.svg b/network-area-diagram/src/test/resources/IEEE_14_bus_voltage_filter1.svg index ae837bda9..677f96399 100644 --- a/network-area-diagram/src/test/resources/IEEE_14_bus_voltage_filter1.svg +++ b/network-area-diagram/src/test/resources/IEEE_14_bus_voltage_filter1.svg @@ -95,7 +95,12 @@ path.nad-arrow-in:not(.nad-state-in .nad-arrow-in) {visibility: hidden} .nad-branch-edges .nad-overload .nad-edge-path {animation: line-blink 3s infinite} .nad-vl-nodes .nad-overvoltage {animation: node-over-blink 3s infinite} .nad-vl-nodes .nad-undervoltage {animation: node-under-blink 3s infinite} - +.nad-highlight {stroke-width: 25; opacity: 0.2; fill: none;} +.nad-highlight-0 {stroke: #e6e600;} +.nad-highlight-1 {stroke: #b300b3;} +.nad-highlight-2 {stroke: #2eb82e;} +.nad-highlight-3 {stroke: #e67300;} +.nad-highlight-4 {stroke: #0000ff;} @keyframes line-blink { 0%, 80%, 100% {stroke: var(--nad-vl-color, black); stroke-width: 5} 40% {stroke: #FFEB3B; stroke-width: 15} diff --git a/network-area-diagram/src/test/resources/IEEE_14_bus_voltage_filter2.svg b/network-area-diagram/src/test/resources/IEEE_14_bus_voltage_filter2.svg index 21ae20c06..d94679f7d 100644 --- a/network-area-diagram/src/test/resources/IEEE_14_bus_voltage_filter2.svg +++ b/network-area-diagram/src/test/resources/IEEE_14_bus_voltage_filter2.svg @@ -95,7 +95,12 @@ path.nad-arrow-in:not(.nad-state-in .nad-arrow-in) {visibility: hidden} .nad-branch-edges .nad-overload .nad-edge-path {animation: line-blink 3s infinite} .nad-vl-nodes .nad-overvoltage {animation: node-over-blink 3s infinite} .nad-vl-nodes .nad-undervoltage {animation: node-under-blink 3s infinite} - +.nad-highlight {stroke-width: 25; opacity: 0.2; fill: none;} +.nad-highlight-0 {stroke: #e6e600;} +.nad-highlight-1 {stroke: #b300b3;} +.nad-highlight-2 {stroke: #2eb82e;} +.nad-highlight-3 {stroke: #e67300;} +.nad-highlight-4 {stroke: #0000ff;} @keyframes line-blink { 0%, 80%, 100% {stroke: var(--nad-vl-color, black); stroke-width: 5} 40% {stroke: #FFEB3B; stroke-width: 15} diff --git a/network-area-diagram/src/test/resources/IEEE_14_bus_voltage_filter2_metadata.json b/network-area-diagram/src/test/resources/IEEE_14_bus_voltage_filter2_metadata.json index a1eb64979..e928e276a 100644 --- a/network-area-diagram/src/test/resources/IEEE_14_bus_voltage_filter2_metadata.json +++ b/network-area-diagram/src/test/resources/IEEE_14_bus_voltage_filter2_metadata.json @@ -53,7 +53,8 @@ "currentValuePrecision" : 0, "edgeInfoDisplayed" : "ACTIVE_POWER", "pstArrowHeadSize" : 8.0, - "undefinedValueSymbol" : "" + "undefinedValueSymbol" : "", + "highlightGraph" : false }, "busNodes" : [ { "svgId" : "1", diff --git a/network-area-diagram/src/test/resources/IEEE_14_bus_voltage_filter3.svg b/network-area-diagram/src/test/resources/IEEE_14_bus_voltage_filter3.svg index 0742169fa..567fab946 100644 --- a/network-area-diagram/src/test/resources/IEEE_14_bus_voltage_filter3.svg +++ b/network-area-diagram/src/test/resources/IEEE_14_bus_voltage_filter3.svg @@ -95,7 +95,12 @@ path.nad-arrow-in:not(.nad-state-in .nad-arrow-in) {visibility: hidden} .nad-branch-edges .nad-overload .nad-edge-path {animation: line-blink 3s infinite} .nad-vl-nodes .nad-overvoltage {animation: node-over-blink 3s infinite} .nad-vl-nodes .nad-undervoltage {animation: node-under-blink 3s infinite} - +.nad-highlight {stroke-width: 25; opacity: 0.2; fill: none;} +.nad-highlight-0 {stroke: #e6e600;} +.nad-highlight-1 {stroke: #b300b3;} +.nad-highlight-2 {stroke: #2eb82e;} +.nad-highlight-3 {stroke: #e67300;} +.nad-highlight-4 {stroke: #0000ff;} @keyframes line-blink { 0%, 80%, 100% {stroke: var(--nad-vl-color, black); stroke-width: 5} 40% {stroke: #FFEB3B; stroke-width: 15} diff --git a/network-area-diagram/src/test/resources/IEEE_14_bus_voltage_filter4.svg b/network-area-diagram/src/test/resources/IEEE_14_bus_voltage_filter4.svg index e5803ab40..d87a1af2e 100644 --- a/network-area-diagram/src/test/resources/IEEE_14_bus_voltage_filter4.svg +++ b/network-area-diagram/src/test/resources/IEEE_14_bus_voltage_filter4.svg @@ -95,7 +95,12 @@ path.nad-arrow-in:not(.nad-state-in .nad-arrow-in) {visibility: hidden} .nad-branch-edges .nad-overload .nad-edge-path {animation: line-blink 3s infinite} .nad-vl-nodes .nad-overvoltage {animation: node-over-blink 3s infinite} .nad-vl-nodes .nad-undervoltage {animation: node-under-blink 3s infinite} - +.nad-highlight {stroke-width: 25; opacity: 0.2; fill: none;} +.nad-highlight-0 {stroke: #e6e600;} +.nad-highlight-1 {stroke: #b300b3;} +.nad-highlight-2 {stroke: #2eb82e;} +.nad-highlight-3 {stroke: #e67300;} +.nad-highlight-4 {stroke: #0000ff;} @keyframes line-blink { 0%, 80%, 100% {stroke: var(--nad-vl-color, black); stroke-width: 5} 40% {stroke: #FFEB3B; stroke-width: 15} diff --git a/network-area-diagram/src/test/resources/IEEE_14_bus_voltage_filter5.svg b/network-area-diagram/src/test/resources/IEEE_14_bus_voltage_filter5.svg index 49ffee0dc..45292cf27 100644 --- a/network-area-diagram/src/test/resources/IEEE_14_bus_voltage_filter5.svg +++ b/network-area-diagram/src/test/resources/IEEE_14_bus_voltage_filter5.svg @@ -95,7 +95,12 @@ path.nad-arrow-in:not(.nad-state-in .nad-arrow-in) {visibility: hidden} .nad-branch-edges .nad-overload .nad-edge-path {animation: line-blink 3s infinite} .nad-vl-nodes .nad-overvoltage {animation: node-over-blink 3s infinite} .nad-vl-nodes .nad-undervoltage {animation: node-under-blink 3s infinite} - +.nad-highlight {stroke-width: 25; opacity: 0.2; fill: none;} +.nad-highlight-0 {stroke: #e6e600;} +.nad-highlight-1 {stroke: #b300b3;} +.nad-highlight-2 {stroke: #2eb82e;} +.nad-highlight-3 {stroke: #e67300;} +.nad-highlight-4 {stroke: #0000ff;} @keyframes line-blink { 0%, 80%, 100% {stroke: var(--nad-vl-color, black); stroke-width: 5} 40% {stroke: #FFEB3B; stroke-width: 15} diff --git a/network-area-diagram/src/test/resources/IEEE_14_bus_voltage_filter5_metadata.json b/network-area-diagram/src/test/resources/IEEE_14_bus_voltage_filter5_metadata.json index f628c8ed9..f48f03147 100644 --- a/network-area-diagram/src/test/resources/IEEE_14_bus_voltage_filter5_metadata.json +++ b/network-area-diagram/src/test/resources/IEEE_14_bus_voltage_filter5_metadata.json @@ -53,7 +53,8 @@ "currentValuePrecision" : 0, "edgeInfoDisplayed" : "ACTIVE_POWER", "pstArrowHeadSize" : 8.0, - "undefinedValueSymbol" : "" + "undefinedValueSymbol" : "", + "highlightGraph" : false }, "busNodes" : [ { "svgId" : "1", diff --git a/network-area-diagram/src/test/resources/IEEE_14_bus_voltage_nofilter.svg b/network-area-diagram/src/test/resources/IEEE_14_bus_voltage_nofilter.svg index 84b8deb55..080218075 100644 --- a/network-area-diagram/src/test/resources/IEEE_14_bus_voltage_nofilter.svg +++ b/network-area-diagram/src/test/resources/IEEE_14_bus_voltage_nofilter.svg @@ -95,7 +95,12 @@ path.nad-arrow-in:not(.nad-state-in .nad-arrow-in) {visibility: hidden} .nad-branch-edges .nad-overload .nad-edge-path {animation: line-blink 3s infinite} .nad-vl-nodes .nad-overvoltage {animation: node-over-blink 3s infinite} .nad-vl-nodes .nad-undervoltage {animation: node-under-blink 3s infinite} - +.nad-highlight {stroke-width: 25; opacity: 0.2; fill: none;} +.nad-highlight-0 {stroke: #e6e600;} +.nad-highlight-1 {stroke: #b300b3;} +.nad-highlight-2 {stroke: #2eb82e;} +.nad-highlight-3 {stroke: #e67300;} +.nad-highlight-4 {stroke: #0000ff;} @keyframes line-blink { 0%, 80%, 100% {stroke: var(--nad-vl-color, black); stroke-width: 5} 40% {stroke: #FFEB3B; stroke-width: 15} diff --git a/network-area-diagram/src/test/resources/IEEE_14_bus_voltage_nofilter_metadata.json b/network-area-diagram/src/test/resources/IEEE_14_bus_voltage_nofilter_metadata.json index f9c95c9c0..2aebe8bee 100644 --- a/network-area-diagram/src/test/resources/IEEE_14_bus_voltage_nofilter_metadata.json +++ b/network-area-diagram/src/test/resources/IEEE_14_bus_voltage_nofilter_metadata.json @@ -53,7 +53,8 @@ "currentValuePrecision" : 0, "edgeInfoDisplayed" : "ACTIVE_POWER", "pstArrowHeadSize" : 8.0, - "undefinedValueSymbol" : "" + "undefinedValueSymbol" : "", + "highlightGraph" : false }, "busNodes" : [ { "svgId" : "1", diff --git a/network-area-diagram/src/test/resources/IEEE_14_id_prefixed.svg b/network-area-diagram/src/test/resources/IEEE_14_id_prefixed.svg index edec9ec3c..93b18ab84 100644 --- a/network-area-diagram/src/test/resources/IEEE_14_id_prefixed.svg +++ b/network-area-diagram/src/test/resources/IEEE_14_id_prefixed.svg @@ -30,7 +30,12 @@ path.nad-arrow-in:not(.nad-state-in .nad-arrow-in) {visibility: hidden} .nad-branch-edges .nad-overload .nad-edge-path {animation: line-blink 3s infinite} .nad-vl-nodes .nad-overvoltage {animation: node-over-blink 3s infinite} .nad-vl-nodes .nad-undervoltage {animation: node-under-blink 3s infinite} - +.nad-highlight {stroke-width: 25; opacity: 0.2; fill: none;} +.nad-highlight-0 {stroke: #e6e600;} +.nad-highlight-1 {stroke: #b300b3;} +.nad-highlight-2 {stroke: #2eb82e;} +.nad-highlight-3 {stroke: #e67300;} +.nad-highlight-4 {stroke: #0000ff;} @keyframes line-blink { 0%, 80%, 100% {stroke: var(--nad-vl-color, black); stroke-width: 5} 40% {stroke: #FFEB3B; stroke-width: 15} diff --git a/network-area-diagram/src/test/resources/IEEE_24_bus.svg b/network-area-diagram/src/test/resources/IEEE_24_bus.svg index 7f379f5a2..caa454cd7 100644 --- a/network-area-diagram/src/test/resources/IEEE_24_bus.svg +++ b/network-area-diagram/src/test/resources/IEEE_24_bus.svg @@ -30,7 +30,12 @@ path.nad-arrow-in:not(.nad-state-in .nad-arrow-in) {visibility: hidden} .nad-branch-edges .nad-overload .nad-edge-path {animation: line-blink 3s infinite} .nad-vl-nodes .nad-overvoltage {animation: node-over-blink 3s infinite} .nad-vl-nodes .nad-undervoltage {animation: node-under-blink 3s infinite} - +.nad-highlight {stroke-width: 25; opacity: 0.2; fill: none;} +.nad-highlight-0 {stroke: #e6e600;} +.nad-highlight-1 {stroke: #b300b3;} +.nad-highlight-2 {stroke: #2eb82e;} +.nad-highlight-3 {stroke: #e67300;} +.nad-highlight-4 {stroke: #0000ff;} @keyframes line-blink { 0%, 80%, 100% {stroke: var(--nad-vl-color, black); stroke-width: 5} 40% {stroke: #FFEB3B; stroke-width: 15} diff --git a/network-area-diagram/src/test/resources/IEEE_30_bus.svg b/network-area-diagram/src/test/resources/IEEE_30_bus.svg index 73a7e3318..f47249188 100644 --- a/network-area-diagram/src/test/resources/IEEE_30_bus.svg +++ b/network-area-diagram/src/test/resources/IEEE_30_bus.svg @@ -30,7 +30,12 @@ path.nad-arrow-in:not(.nad-state-in .nad-arrow-in) {visibility: hidden} .nad-branch-edges .nad-overload .nad-edge-path {animation: line-blink 3s infinite} .nad-vl-nodes .nad-overvoltage {animation: node-over-blink 3s infinite} .nad-vl-nodes .nad-undervoltage {animation: node-under-blink 3s infinite} - +.nad-highlight {stroke-width: 25; opacity: 0.2; fill: none;} +.nad-highlight-0 {stroke: #e6e600;} +.nad-highlight-1 {stroke: #b300b3;} +.nad-highlight-2 {stroke: #2eb82e;} +.nad-highlight-3 {stroke: #e67300;} +.nad-highlight-4 {stroke: #0000ff;} @keyframes line-blink { 0%, 80%, 100% {stroke: var(--nad-vl-color, black); stroke-width: 5} 40% {stroke: #FFEB3B; stroke-width: 15} diff --git a/network-area-diagram/src/test/resources/IEEE_57_bus.svg b/network-area-diagram/src/test/resources/IEEE_57_bus.svg index b818eaf59..c53c5665b 100644 --- a/network-area-diagram/src/test/resources/IEEE_57_bus.svg +++ b/network-area-diagram/src/test/resources/IEEE_57_bus.svg @@ -95,7 +95,12 @@ path.nad-arrow-in:not(.nad-state-in .nad-arrow-in) {visibility: hidden} .nad-branch-edges .nad-overload .nad-edge-path {animation: line-blink 3s infinite} .nad-vl-nodes .nad-overvoltage {animation: node-over-blink 3s infinite} .nad-vl-nodes .nad-undervoltage {animation: node-under-blink 3s infinite} - +.nad-highlight {stroke-width: 25; opacity: 0.2; fill: none;} +.nad-highlight-0 {stroke: #e6e600;} +.nad-highlight-1 {stroke: #b300b3;} +.nad-highlight-2 {stroke: #2eb82e;} +.nad-highlight-3 {stroke: #e67300;} +.nad-highlight-4 {stroke: #0000ff;} @keyframes line-blink { 0%, 80%, 100% {stroke: var(--nad-vl-color, black); stroke-width: 5} 40% {stroke: #FFEB3B; stroke-width: 15} diff --git a/network-area-diagram/src/test/resources/current_limits.svg b/network-area-diagram/src/test/resources/current_limits.svg index d967a8463..0160a8fed 100644 --- a/network-area-diagram/src/test/resources/current_limits.svg +++ b/network-area-diagram/src/test/resources/current_limits.svg @@ -30,7 +30,12 @@ path.nad-arrow-in:not(.nad-state-in .nad-arrow-in) {visibility: hidden} .nad-branch-edges .nad-overload .nad-edge-path {animation: line-blink 3s infinite} .nad-vl-nodes .nad-overvoltage {animation: node-over-blink 3s infinite} .nad-vl-nodes .nad-undervoltage {animation: node-under-blink 3s infinite} - +.nad-highlight {stroke-width: 25; opacity: 0.2; fill: none;} +.nad-highlight-0 {stroke: #e6e600;} +.nad-highlight-1 {stroke: #b300b3;} +.nad-highlight-2 {stroke: #2eb82e;} +.nad-highlight-3 {stroke: #e67300;} +.nad-highlight-4 {stroke: #0000ff;} @keyframes line-blink { 0%, 80%, 100% {stroke: var(--nad-vl-color, black); stroke-width: 5} 40% {stroke: #FFEB3B; stroke-width: 15} diff --git a/network-area-diagram/src/test/resources/custom_label_provider.svg b/network-area-diagram/src/test/resources/custom_label_provider.svg index 86e66d18d..330a2f369 100644 --- a/network-area-diagram/src/test/resources/custom_label_provider.svg +++ b/network-area-diagram/src/test/resources/custom_label_provider.svg @@ -95,7 +95,12 @@ path.nad-arrow-in:not(.nad-state-in .nad-arrow-in) {visibility: hidden} .nad-branch-edges .nad-overload .nad-edge-path {animation: line-blink 3s infinite} .nad-vl-nodes .nad-overvoltage {animation: node-over-blink 3s infinite} .nad-vl-nodes .nad-undervoltage {animation: node-under-blink 3s infinite} - +.nad-highlight {stroke-width: 25; opacity: 0.2; fill: none;} +.nad-highlight-0 {stroke: #e6e600;} +.nad-highlight-1 {stroke: #b300b3;} +.nad-highlight-2 {stroke: #2eb82e;} +.nad-highlight-3 {stroke: #e67300;} +.nad-highlight-4 {stroke: #0000ff;} @keyframes line-blink { 0%, 80%, 100% {stroke: var(--nad-vl-color, black); stroke-width: 5} 40% {stroke: #FFEB3B; stroke-width: 15} diff --git a/network-area-diagram/src/test/resources/custom_label_provider_3wt.svg b/network-area-diagram/src/test/resources/custom_label_provider_3wt.svg index 6e659b8d2..6fa75f4fb 100644 --- a/network-area-diagram/src/test/resources/custom_label_provider_3wt.svg +++ b/network-area-diagram/src/test/resources/custom_label_provider_3wt.svg @@ -95,7 +95,12 @@ path.nad-arrow-in:not(.nad-state-in .nad-arrow-in) {visibility: hidden} .nad-branch-edges .nad-overload .nad-edge-path {animation: line-blink 3s infinite} .nad-vl-nodes .nad-overvoltage {animation: node-over-blink 3s infinite} .nad-vl-nodes .nad-undervoltage {animation: node-under-blink 3s infinite} - +.nad-highlight {stroke-width: 25; opacity: 0.2; fill: none;} +.nad-highlight-0 {stroke: #e6e600;} +.nad-highlight-1 {stroke: #b300b3;} +.nad-highlight-2 {stroke: #2eb82e;} +.nad-highlight-3 {stroke: #e67300;} +.nad-highlight-4 {stroke: #0000ff;} @keyframes line-blink { 0%, 80%, 100% {stroke: var(--nad-vl-color, black); stroke-width: 5} 40% {stroke: #FFEB3B; stroke-width: 15} diff --git a/network-area-diagram/src/test/resources/dangling_line_connected.svg b/network-area-diagram/src/test/resources/dangling_line_connected.svg index d4f27fb44..99f72e2d0 100644 --- a/network-area-diagram/src/test/resources/dangling_line_connected.svg +++ b/network-area-diagram/src/test/resources/dangling_line_connected.svg @@ -30,7 +30,12 @@ path.nad-arrow-in:not(.nad-state-in .nad-arrow-in) {visibility: hidden} .nad-branch-edges .nad-overload .nad-edge-path {animation: line-blink 3s infinite} .nad-vl-nodes .nad-overvoltage {animation: node-over-blink 3s infinite} .nad-vl-nodes .nad-undervoltage {animation: node-under-blink 3s infinite} - +.nad-highlight {stroke-width: 25; opacity: 0.2; fill: none;} +.nad-highlight-0 {stroke: #e6e600;} +.nad-highlight-1 {stroke: #b300b3;} +.nad-highlight-2 {stroke: #2eb82e;} +.nad-highlight-3 {stroke: #e67300;} +.nad-highlight-4 {stroke: #0000ff;} @keyframes line-blink { 0%, 80%, 100% {stroke: var(--nad-vl-color, black); stroke-width: 5} 40% {stroke: #FFEB3B; stroke-width: 15} diff --git a/network-area-diagram/src/test/resources/dangling_line_disconnected.svg b/network-area-diagram/src/test/resources/dangling_line_disconnected.svg index 6f750267d..4f345651f 100644 --- a/network-area-diagram/src/test/resources/dangling_line_disconnected.svg +++ b/network-area-diagram/src/test/resources/dangling_line_disconnected.svg @@ -30,7 +30,12 @@ path.nad-arrow-in:not(.nad-state-in .nad-arrow-in) {visibility: hidden} .nad-branch-edges .nad-overload .nad-edge-path {animation: line-blink 3s infinite} .nad-vl-nodes .nad-overvoltage {animation: node-over-blink 3s infinite} .nad-vl-nodes .nad-undervoltage {animation: node-under-blink 3s infinite} - +.nad-highlight {stroke-width: 25; opacity: 0.2; fill: none;} +.nad-highlight-0 {stroke: #e6e600;} +.nad-highlight-1 {stroke: #b300b3;} +.nad-highlight-2 {stroke: #2eb82e;} +.nad-highlight-3 {stroke: #e67300;} +.nad-highlight-4 {stroke: #0000ff;} @keyframes line-blink { 0%, 80%, 100% {stroke: var(--nad-vl-color, black); stroke-width: 5} 40% {stroke: #FFEB3B; stroke-width: 15} diff --git a/network-area-diagram/src/test/resources/detailed_text_node.svg b/network-area-diagram/src/test/resources/detailed_text_node.svg index 93fdd1e61..53c0b4887 100644 --- a/network-area-diagram/src/test/resources/detailed_text_node.svg +++ b/network-area-diagram/src/test/resources/detailed_text_node.svg @@ -95,7 +95,12 @@ path.nad-arrow-in:not(.nad-state-in .nad-arrow-in) {visibility: hidden} .nad-branch-edges .nad-overload .nad-edge-path {animation: line-blink 3s infinite} .nad-vl-nodes .nad-overvoltage {animation: node-over-blink 3s infinite} .nad-vl-nodes .nad-undervoltage {animation: node-under-blink 3s infinite} - +.nad-highlight {stroke-width: 25; opacity: 0.2; fill: none;} +.nad-highlight-0 {stroke: #e6e600;} +.nad-highlight-1 {stroke: #b300b3;} +.nad-highlight-2 {stroke: #2eb82e;} +.nad-highlight-3 {stroke: #e67300;} +.nad-highlight-4 {stroke: #0000ff;} @keyframes line-blink { 0%, 80%, 100% {stroke: var(--nad-vl-color, black); stroke-width: 5} 40% {stroke: #FFEB3B; stroke-width: 15} diff --git a/network-area-diagram/src/test/resources/detailed_text_node_no_legend.svg b/network-area-diagram/src/test/resources/detailed_text_node_no_legend.svg index 9dc005324..34f3a885c 100644 --- a/network-area-diagram/src/test/resources/detailed_text_node_no_legend.svg +++ b/network-area-diagram/src/test/resources/detailed_text_node_no_legend.svg @@ -95,7 +95,12 @@ path.nad-arrow-in:not(.nad-state-in .nad-arrow-in) {visibility: hidden} .nad-branch-edges .nad-overload .nad-edge-path {animation: line-blink 3s infinite} .nad-vl-nodes .nad-overvoltage {animation: node-over-blink 3s infinite} .nad-vl-nodes .nad-undervoltage {animation: node-under-blink 3s infinite} - +.nad-highlight {stroke-width: 25; opacity: 0.2; fill: none;} +.nad-highlight-0 {stroke: #e6e600;} +.nad-highlight-1 {stroke: #b300b3;} +.nad-highlight-2 {stroke: #2eb82e;} +.nad-highlight-3 {stroke: #e67300;} +.nad-highlight-4 {stroke: #0000ff;} @keyframes line-blink { 0%, 80%, 100% {stroke: var(--nad-vl-color, black); stroke-width: 5} 40% {stroke: #FFEB3B; stroke-width: 15} diff --git a/network-area-diagram/src/test/resources/diamond-spring-repulsion-factor-0.0.svg b/network-area-diagram/src/test/resources/diamond-spring-repulsion-factor-0.0.svg index a18ab1ed2..09e233dcd 100644 --- a/network-area-diagram/src/test/resources/diamond-spring-repulsion-factor-0.0.svg +++ b/network-area-diagram/src/test/resources/diamond-spring-repulsion-factor-0.0.svg @@ -30,7 +30,12 @@ path.nad-arrow-in:not(.nad-state-in .nad-arrow-in) {visibility: hidden} .nad-branch-edges .nad-overload .nad-edge-path {animation: line-blink 3s infinite} .nad-vl-nodes .nad-overvoltage {animation: node-over-blink 3s infinite} .nad-vl-nodes .nad-undervoltage {animation: node-under-blink 3s infinite} - +.nad-highlight {stroke-width: 25; opacity: 0.2; fill: none;} +.nad-highlight-0 {stroke: #e6e600;} +.nad-highlight-1 {stroke: #b300b3;} +.nad-highlight-2 {stroke: #2eb82e;} +.nad-highlight-3 {stroke: #e67300;} +.nad-highlight-4 {stroke: #0000ff;} @keyframes line-blink { 0%, 80%, 100% {stroke: var(--nad-vl-color, black); stroke-width: 5} 40% {stroke: #FFEB3B; stroke-width: 15} diff --git a/network-area-diagram/src/test/resources/diamond-spring-repulsion-factor-0.2.svg b/network-area-diagram/src/test/resources/diamond-spring-repulsion-factor-0.2.svg index 9324a1c8e..75cd3bc9b 100644 --- a/network-area-diagram/src/test/resources/diamond-spring-repulsion-factor-0.2.svg +++ b/network-area-diagram/src/test/resources/diamond-spring-repulsion-factor-0.2.svg @@ -30,7 +30,12 @@ path.nad-arrow-in:not(.nad-state-in .nad-arrow-in) {visibility: hidden} .nad-branch-edges .nad-overload .nad-edge-path {animation: line-blink 3s infinite} .nad-vl-nodes .nad-overvoltage {animation: node-over-blink 3s infinite} .nad-vl-nodes .nad-undervoltage {animation: node-under-blink 3s infinite} - +.nad-highlight {stroke-width: 25; opacity: 0.2; fill: none;} +.nad-highlight-0 {stroke: #e6e600;} +.nad-highlight-1 {stroke: #b300b3;} +.nad-highlight-2 {stroke: #2eb82e;} +.nad-highlight-3 {stroke: #e67300;} +.nad-highlight-4 {stroke: #0000ff;} @keyframes line-blink { 0%, 80%, 100% {stroke: var(--nad-vl-color, black); stroke-width: 5} 40% {stroke: #FFEB3B; stroke-width: 15} diff --git a/network-area-diagram/src/test/resources/edge_info_current.svg b/network-area-diagram/src/test/resources/edge_info_current.svg index 5824c4307..f26878252 100644 --- a/network-area-diagram/src/test/resources/edge_info_current.svg +++ b/network-area-diagram/src/test/resources/edge_info_current.svg @@ -30,7 +30,12 @@ path.nad-arrow-in:not(.nad-state-in .nad-arrow-in) {visibility: hidden} .nad-branch-edges .nad-overload .nad-edge-path {animation: line-blink 3s infinite} .nad-vl-nodes .nad-overvoltage {animation: node-over-blink 3s infinite} .nad-vl-nodes .nad-undervoltage {animation: node-under-blink 3s infinite} - +.nad-highlight {stroke-width: 25; opacity: 0.2; fill: none;} +.nad-highlight-0 {stroke: #e6e600;} +.nad-highlight-1 {stroke: #b300b3;} +.nad-highlight-2 {stroke: #2eb82e;} +.nad-highlight-3 {stroke: #e67300;} +.nad-highlight-4 {stroke: #0000ff;} @keyframes line-blink { 0%, 80%, 100% {stroke: var(--nad-vl-color, black); stroke-width: 5} 40% {stroke: #FFEB3B; stroke-width: 15} diff --git a/network-area-diagram/src/test/resources/edge_info_double_labels.svg b/network-area-diagram/src/test/resources/edge_info_double_labels.svg index 40cf23a86..e7042316c 100644 --- a/network-area-diagram/src/test/resources/edge_info_double_labels.svg +++ b/network-area-diagram/src/test/resources/edge_info_double_labels.svg @@ -30,7 +30,12 @@ path.nad-arrow-in:not(.nad-state-in .nad-arrow-in) {visibility: hidden} .nad-branch-edges .nad-overload .nad-edge-path {animation: line-blink 3s infinite} .nad-vl-nodes .nad-overvoltage {animation: node-over-blink 3s infinite} .nad-vl-nodes .nad-undervoltage {animation: node-under-blink 3s infinite} - +.nad-highlight {stroke-width: 25; opacity: 0.2; fill: none;} +.nad-highlight-0 {stroke: #e6e600;} +.nad-highlight-1 {stroke: #b300b3;} +.nad-highlight-2 {stroke: #2eb82e;} +.nad-highlight-3 {stroke: #e67300;} +.nad-highlight-4 {stroke: #0000ff;} @keyframes line-blink { 0%, 80%, 100% {stroke: var(--nad-vl-color, black); stroke-width: 5} 40% {stroke: #FFEB3B; stroke-width: 15} diff --git a/network-area-diagram/src/test/resources/edge_info_missing_label.svg b/network-area-diagram/src/test/resources/edge_info_missing_label.svg index 11f0cec0b..f7ec42cc5 100644 --- a/network-area-diagram/src/test/resources/edge_info_missing_label.svg +++ b/network-area-diagram/src/test/resources/edge_info_missing_label.svg @@ -30,7 +30,12 @@ path.nad-arrow-in:not(.nad-state-in .nad-arrow-in) {visibility: hidden} .nad-branch-edges .nad-overload .nad-edge-path {animation: line-blink 3s infinite} .nad-vl-nodes .nad-overvoltage {animation: node-over-blink 3s infinite} .nad-vl-nodes .nad-undervoltage {animation: node-under-blink 3s infinite} - +.nad-highlight {stroke-width: 25; opacity: 0.2; fill: none;} +.nad-highlight-0 {stroke: #e6e600;} +.nad-highlight-1 {stroke: #b300b3;} +.nad-highlight-2 {stroke: #2eb82e;} +.nad-highlight-3 {stroke: #e67300;} +.nad-highlight-4 {stroke: #0000ff;} @keyframes line-blink { 0%, 80%, 100% {stroke: var(--nad-vl-color, black); stroke-width: 5} 40% {stroke: #FFEB3B; stroke-width: 15} diff --git a/network-area-diagram/src/test/resources/edge_info_perpendicular_label.svg b/network-area-diagram/src/test/resources/edge_info_perpendicular_label.svg index 4b4659ce6..462bdb59a 100644 --- a/network-area-diagram/src/test/resources/edge_info_perpendicular_label.svg +++ b/network-area-diagram/src/test/resources/edge_info_perpendicular_label.svg @@ -30,7 +30,12 @@ path.nad-arrow-in:not(.nad-state-in .nad-arrow-in) {visibility: hidden} .nad-branch-edges .nad-overload .nad-edge-path {animation: line-blink 3s infinite} .nad-vl-nodes .nad-overvoltage {animation: node-over-blink 3s infinite} .nad-vl-nodes .nad-undervoltage {animation: node-under-blink 3s infinite} - +.nad-highlight {stroke-width: 25; opacity: 0.2; fill: none;} +.nad-highlight-0 {stroke: #e6e600;} +.nad-highlight-1 {stroke: #b300b3;} +.nad-highlight-2 {stroke: #2eb82e;} +.nad-highlight-3 {stroke: #e67300;} +.nad-highlight-4 {stroke: #0000ff;} @keyframes line-blink { 0%, 80%, 100% {stroke: var(--nad-vl-color, black); stroke-width: 5} 40% {stroke: #FFEB3B; stroke-width: 15} diff --git a/network-area-diagram/src/test/resources/edge_info_reactive_power.svg b/network-area-diagram/src/test/resources/edge_info_reactive_power.svg index 290617e7f..568be4ac5 100644 --- a/network-area-diagram/src/test/resources/edge_info_reactive_power.svg +++ b/network-area-diagram/src/test/resources/edge_info_reactive_power.svg @@ -30,7 +30,12 @@ path.nad-arrow-in:not(.nad-state-in .nad-arrow-in) {visibility: hidden} .nad-branch-edges .nad-overload .nad-edge-path {animation: line-blink 3s infinite} .nad-vl-nodes .nad-overvoltage {animation: node-over-blink 3s infinite} .nad-vl-nodes .nad-undervoltage {animation: node-under-blink 3s infinite} - +.nad-highlight {stroke-width: 25; opacity: 0.2; fill: none;} +.nad-highlight-0 {stroke: #e6e600;} +.nad-highlight-1 {stroke: #b300b3;} +.nad-highlight-2 {stroke: #2eb82e;} +.nad-highlight-3 {stroke: #e67300;} +.nad-highlight-4 {stroke: #0000ff;} @keyframes line-blink { 0%, 80%, 100% {stroke: var(--nad-vl-color, black); stroke-width: 5} 40% {stroke: #FFEB3B; stroke-width: 15} diff --git a/network-area-diagram/src/test/resources/edge_info_shift.svg b/network-area-diagram/src/test/resources/edge_info_shift.svg index 24b9411a0..70a041f84 100644 --- a/network-area-diagram/src/test/resources/edge_info_shift.svg +++ b/network-area-diagram/src/test/resources/edge_info_shift.svg @@ -30,7 +30,12 @@ path.nad-arrow-in:not(.nad-state-in .nad-arrow-in) {visibility: hidden} .nad-branch-edges .nad-overload .nad-edge-path {animation: line-blink 3s infinite} .nad-vl-nodes .nad-overvoltage {animation: node-over-blink 3s infinite} .nad-vl-nodes .nad-undervoltage {animation: node-under-blink 3s infinite} - +.nad-highlight {stroke-width: 25; opacity: 0.2; fill: none;} +.nad-highlight-0 {stroke: #e6e600;} +.nad-highlight-1 {stroke: #b300b3;} +.nad-highlight-2 {stroke: #2eb82e;} +.nad-highlight-3 {stroke: #e67300;} +.nad-highlight-4 {stroke: #0000ff;} @keyframes line-blink { 0%, 80%, 100% {stroke: var(--nad-vl-color, black); stroke-width: 5} 40% {stroke: #FFEB3B; stroke-width: 15} diff --git a/network-area-diagram/src/test/resources/edge_with_id.svg b/network-area-diagram/src/test/resources/edge_with_id.svg index 578b58400..1794272aa 100644 --- a/network-area-diagram/src/test/resources/edge_with_id.svg +++ b/network-area-diagram/src/test/resources/edge_with_id.svg @@ -30,7 +30,12 @@ path.nad-arrow-in:not(.nad-state-in .nad-arrow-in) {visibility: hidden} .nad-branch-edges .nad-overload .nad-edge-path {animation: line-blink 3s infinite} .nad-vl-nodes .nad-overvoltage {animation: node-over-blink 3s infinite} .nad-vl-nodes .nad-undervoltage {animation: node-under-blink 3s infinite} - +.nad-highlight {stroke-width: 25; opacity: 0.2; fill: none;} +.nad-highlight-0 {stroke: #e6e600;} +.nad-highlight-1 {stroke: #b300b3;} +.nad-highlight-2 {stroke: #2eb82e;} +.nad-highlight-3 {stroke: #e67300;} +.nad-highlight-4 {stroke: #0000ff;} @keyframes line-blink { 0%, 80%, 100% {stroke: var(--nad-vl-color, black); stroke-width: 5} 40% {stroke: #FFEB3B; stroke-width: 15} diff --git a/network-area-diagram/src/test/resources/edge_without_id.svg b/network-area-diagram/src/test/resources/edge_without_id.svg index d4f27fb44..99f72e2d0 100644 --- a/network-area-diagram/src/test/resources/edge_without_id.svg +++ b/network-area-diagram/src/test/resources/edge_without_id.svg @@ -30,7 +30,12 @@ path.nad-arrow-in:not(.nad-state-in .nad-arrow-in) {visibility: hidden} .nad-branch-edges .nad-overload .nad-edge-path {animation: line-blink 3s infinite} .nad-vl-nodes .nad-overvoltage {animation: node-over-blink 3s infinite} .nad-vl-nodes .nad-undervoltage {animation: node-under-blink 3s infinite} - +.nad-highlight {stroke-width: 25; opacity: 0.2; fill: none;} +.nad-highlight-0 {stroke: #e6e600;} +.nad-highlight-1 {stroke: #b300b3;} +.nad-highlight-2 {stroke: #2eb82e;} +.nad-highlight-3 {stroke: #e67300;} +.nad-highlight-4 {stroke: #0000ff;} @keyframes line-blink { 0%, 80%, 100% {stroke: var(--nad-vl-color, black); stroke-width: 5} 40% {stroke: #FFEB3B; stroke-width: 15} diff --git a/network-area-diagram/src/test/resources/hvdc-vl-depth-1.svg b/network-area-diagram/src/test/resources/hvdc-vl-depth-1.svg index aee3ac3c1..4dc0b407d 100644 --- a/network-area-diagram/src/test/resources/hvdc-vl-depth-1.svg +++ b/network-area-diagram/src/test/resources/hvdc-vl-depth-1.svg @@ -30,7 +30,12 @@ path.nad-arrow-in:not(.nad-state-in .nad-arrow-in) {visibility: hidden} .nad-branch-edges .nad-overload .nad-edge-path {animation: line-blink 3s infinite} .nad-vl-nodes .nad-overvoltage {animation: node-over-blink 3s infinite} .nad-vl-nodes .nad-undervoltage {animation: node-under-blink 3s infinite} - +.nad-highlight {stroke-width: 25; opacity: 0.2; fill: none;} +.nad-highlight-0 {stroke: #e6e600;} +.nad-highlight-1 {stroke: #b300b3;} +.nad-highlight-2 {stroke: #2eb82e;} +.nad-highlight-3 {stroke: #e67300;} +.nad-highlight-4 {stroke: #0000ff;} @keyframes line-blink { 0%, 80%, 100% {stroke: var(--nad-vl-color, black); stroke-width: 5} 40% {stroke: #FFEB3B; stroke-width: 15} diff --git a/network-area-diagram/src/test/resources/hvdc.svg b/network-area-diagram/src/test/resources/hvdc.svg index c64bd524e..3752aeed1 100644 --- a/network-area-diagram/src/test/resources/hvdc.svg +++ b/network-area-diagram/src/test/resources/hvdc.svg @@ -30,7 +30,12 @@ path.nad-arrow-in:not(.nad-state-in .nad-arrow-in) {visibility: hidden} .nad-branch-edges .nad-overload .nad-edge-path {animation: line-blink 3s infinite} .nad-vl-nodes .nad-overvoltage {animation: node-over-blink 3s infinite} .nad-vl-nodes .nad-undervoltage {animation: node-under-blink 3s infinite} - +.nad-highlight {stroke-width: 25; opacity: 0.2; fill: none;} +.nad-highlight-0 {stroke: #e6e600;} +.nad-highlight-1 {stroke: #b300b3;} +.nad-highlight-2 {stroke: #2eb82e;} +.nad-highlight-3 {stroke: #e67300;} +.nad-highlight-4 {stroke: #0000ff;} @keyframes line-blink { 0%, 80%, 100% {stroke: var(--nad-vl-color, black); stroke-width: 5} 40% {stroke: #FFEB3B; stroke-width: 15} diff --git a/network-area-diagram/src/test/resources/hvdc_metadata.json b/network-area-diagram/src/test/resources/hvdc_metadata.json index d5f504c0f..e83151eed 100644 --- a/network-area-diagram/src/test/resources/hvdc_metadata.json +++ b/network-area-diagram/src/test/resources/hvdc_metadata.json @@ -53,7 +53,8 @@ "currentValuePrecision" : 0, "edgeInfoDisplayed" : "ACTIVE_POWER", "pstArrowHeadSize" : 8.0, - "undefinedValueSymbol" : "" + "undefinedValueSymbol" : "", + "highlightGraph" : false }, "busNodes" : [ { "svgId" : "1", diff --git a/network-area-diagram/src/test/resources/parallel_transformers.svg b/network-area-diagram/src/test/resources/parallel_transformers.svg index ebcdde042..54b8d6045 100644 --- a/network-area-diagram/src/test/resources/parallel_transformers.svg +++ b/network-area-diagram/src/test/resources/parallel_transformers.svg @@ -30,7 +30,12 @@ path.nad-arrow-in:not(.nad-state-in .nad-arrow-in) {visibility: hidden} .nad-branch-edges .nad-overload .nad-edge-path {animation: line-blink 3s infinite} .nad-vl-nodes .nad-overvoltage {animation: node-over-blink 3s infinite} .nad-vl-nodes .nad-undervoltage {animation: node-under-blink 3s infinite} - +.nad-highlight {stroke-width: 25; opacity: 0.2; fill: none;} +.nad-highlight-0 {stroke: #e6e600;} +.nad-highlight-1 {stroke: #b300b3;} +.nad-highlight-2 {stroke: #2eb82e;} +.nad-highlight-3 {stroke: #e67300;} +.nad-highlight-4 {stroke: #0000ff;} @keyframes line-blink { 0%, 80%, 100% {stroke: var(--nad-vl-color, black); stroke-width: 5} 40% {stroke: #FFEB3B; stroke-width: 15} diff --git a/network-area-diagram/src/test/resources/partial_graph_subnetwork_highlight.svg b/network-area-diagram/src/test/resources/partial_graph_subnetwork_highlight.svg new file mode 100644 index 000000000..4fe945f9f --- /dev/null +++ b/network-area-diagram/src/test/resources/partial_graph_subnetwork_highlight.svg @@ -0,0 +1,350 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + -605 + + + + + + + + + + + + + + + + + + 302 + + + + + + + + + + + + -300 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 601 + + + + + + + + + + + + -600 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 100 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
VLHV1
+ + + + + +
+
+
402.1 kV / 0.0°
+
+
+ +
+
VLHV2
+ + + + + +
+
+
390.0 kV / -3.5°
+
+
+ +
+
VLHV3
+ + + + + +
+
+
197.6 kV / 3.0°
+
+
+ +
+
VLLOAD
+ + + + + +
+
+
147.6 kV / -9.6°
+
+
+
+
diff --git a/network-area-diagram/src/test/resources/production_consumption_text_node.svg b/network-area-diagram/src/test/resources/production_consumption_text_node.svg index 6c624037c..d2f1ca1dc 100644 --- a/network-area-diagram/src/test/resources/production_consumption_text_node.svg +++ b/network-area-diagram/src/test/resources/production_consumption_text_node.svg @@ -95,7 +95,12 @@ path.nad-arrow-in:not(.nad-state-in .nad-arrow-in) {visibility: hidden} .nad-branch-edges .nad-overload .nad-edge-path {animation: line-blink 3s infinite} .nad-vl-nodes .nad-overvoltage {animation: node-over-blink 3s infinite} .nad-vl-nodes .nad-undervoltage {animation: node-under-blink 3s infinite} - +.nad-highlight {stroke-width: 25; opacity: 0.2; fill: none;} +.nad-highlight-0 {stroke: #e6e600;} +.nad-highlight-1 {stroke: #b300b3;} +.nad-highlight-2 {stroke: #2eb82e;} +.nad-highlight-3 {stroke: #e67300;} +.nad-highlight-4 {stroke: #0000ff;} @keyframes line-blink { 0%, 80%, 100% {stroke: var(--nad-vl-color, black); stroke-width: 5} 40% {stroke: #FFEB3B; stroke-width: 15} diff --git a/network-area-diagram/src/test/resources/production_consumption_text_node_nan.svg b/network-area-diagram/src/test/resources/production_consumption_text_node_nan.svg index bb1d0b443..9f1d590ab 100644 --- a/network-area-diagram/src/test/resources/production_consumption_text_node_nan.svg +++ b/network-area-diagram/src/test/resources/production_consumption_text_node_nan.svg @@ -95,7 +95,12 @@ path.nad-arrow-in:not(.nad-state-in .nad-arrow-in) {visibility: hidden} .nad-branch-edges .nad-overload .nad-edge-path {animation: line-blink 3s infinite} .nad-vl-nodes .nad-overvoltage {animation: node-over-blink 3s infinite} .nad-vl-nodes .nad-undervoltage {animation: node-under-blink 3s infinite} - +.nad-highlight {stroke-width: 25; opacity: 0.2; fill: none;} +.nad-highlight-0 {stroke: #e6e600;} +.nad-highlight-1 {stroke: #b300b3;} +.nad-highlight-2 {stroke: #2eb82e;} +.nad-highlight-3 {stroke: #e67300;} +.nad-highlight-4 {stroke: #0000ff;} @keyframes line-blink { 0%, 80%, 100% {stroke: var(--nad-vl-color, black); stroke-width: 5} 40% {stroke: #FFEB3B; stroke-width: 15} diff --git a/network-area-diagram/src/test/resources/simple-eu-loop100.svg b/network-area-diagram/src/test/resources/simple-eu-loop100.svg index 4cb25ee49..02d83a9d5 100644 --- a/network-area-diagram/src/test/resources/simple-eu-loop100.svg +++ b/network-area-diagram/src/test/resources/simple-eu-loop100.svg @@ -95,7 +95,12 @@ path.nad-arrow-in:not(.nad-state-in .nad-arrow-in) {visibility: hidden} .nad-branch-edges .nad-overload .nad-edge-path {animation: line-blink 3s infinite} .nad-vl-nodes .nad-overvoltage {animation: node-over-blink 3s infinite} .nad-vl-nodes .nad-undervoltage {animation: node-under-blink 3s infinite} - +.nad-highlight {stroke-width: 25; opacity: 0.2; fill: none;} +.nad-highlight-0 {stroke: #e6e600;} +.nad-highlight-1 {stroke: #b300b3;} +.nad-highlight-2 {stroke: #2eb82e;} +.nad-highlight-3 {stroke: #e67300;} +.nad-highlight-4 {stroke: #0000ff;} @keyframes line-blink { 0%, 80%, 100% {stroke: var(--nad-vl-color, black); stroke-width: 5} 40% {stroke: #FFEB3B; stroke-width: 15} diff --git a/network-area-diagram/src/test/resources/simple-eu-loop80.svg b/network-area-diagram/src/test/resources/simple-eu-loop80.svg index 1dee369ce..b9ddc590d 100644 --- a/network-area-diagram/src/test/resources/simple-eu-loop80.svg +++ b/network-area-diagram/src/test/resources/simple-eu-loop80.svg @@ -95,7 +95,12 @@ path.nad-arrow-in:not(.nad-state-in .nad-arrow-in) {visibility: hidden} .nad-branch-edges .nad-overload .nad-edge-path {animation: line-blink 3s infinite} .nad-vl-nodes .nad-overvoltage {animation: node-over-blink 3s infinite} .nad-vl-nodes .nad-undervoltage {animation: node-under-blink 3s infinite} - +.nad-highlight {stroke-width: 25; opacity: 0.2; fill: none;} +.nad-highlight-0 {stroke: #e6e600;} +.nad-highlight-1 {stroke: #b300b3;} +.nad-highlight-2 {stroke: #2eb82e;} +.nad-highlight-3 {stroke: #e67300;} +.nad-highlight-4 {stroke: #0000ff;} @keyframes line-blink { 0%, 80%, 100% {stroke: var(--nad-vl-color, black); stroke-width: 5} 40% {stroke: #FFEB3B; stroke-width: 15} diff --git a/network-area-diagram/src/test/resources/simple-eu.svg b/network-area-diagram/src/test/resources/simple-eu.svg index ff5934f64..9516288c1 100644 --- a/network-area-diagram/src/test/resources/simple-eu.svg +++ b/network-area-diagram/src/test/resources/simple-eu.svg @@ -95,7 +95,12 @@ path.nad-arrow-in:not(.nad-state-in .nad-arrow-in) {visibility: hidden} .nad-branch-edges .nad-overload .nad-edge-path {animation: line-blink 3s infinite} .nad-vl-nodes .nad-overvoltage {animation: node-over-blink 3s infinite} .nad-vl-nodes .nad-undervoltage {animation: node-under-blink 3s infinite} - +.nad-highlight {stroke-width: 25; opacity: 0.2; fill: none;} +.nad-highlight-0 {stroke: #e6e600;} +.nad-highlight-1 {stroke: #b300b3;} +.nad-highlight-2 {stroke: #2eb82e;} +.nad-highlight-3 {stroke: #e67300;} +.nad-highlight-4 {stroke: #0000ff;} @keyframes line-blink { 0%, 80%, 100% {stroke: var(--nad-vl-color, black); stroke-width: 5} 40% {stroke: #FFEB3B; stroke-width: 15} diff --git a/network-area-diagram/src/test/resources/simple-eu_overridden_styles.svg b/network-area-diagram/src/test/resources/simple-eu_overridden_styles.svg index 04b8dd175..56381e718 100644 --- a/network-area-diagram/src/test/resources/simple-eu_overridden_styles.svg +++ b/network-area-diagram/src/test/resources/simple-eu_overridden_styles.svg @@ -95,7 +95,12 @@ path.nad-arrow-in:not(.nad-state-in .nad-arrow-in) {visibility: hidden} .nad-branch-edges .nad-overload .nad-edge-path {animation: line-blink 3s infinite} .nad-vl-nodes .nad-overvoltage {animation: node-over-blink 3s infinite} .nad-vl-nodes .nad-undervoltage {animation: node-under-blink 3s infinite} - +.nad-highlight {stroke-width: 25; opacity: 0.2; fill: none;} +.nad-highlight-0 {stroke: #e6e600;} +.nad-highlight-1 {stroke: #b300b3;} +.nad-highlight-2 {stroke: #2eb82e;} +.nad-highlight-3 {stroke: #e67300;} +.nad-highlight-4 {stroke: #0000ff;} @keyframes line-blink { 0%, 80%, 100% {stroke: var(--nad-vl-color, black); stroke-width: 5} 40% {stroke: #FFEB3B; stroke-width: 15} diff --git a/network-area-diagram/src/test/resources/subnetwork_highlight.svg b/network-area-diagram/src/test/resources/subnetwork_highlight.svg new file mode 100644 index 000000000..ef4fe7ad3 --- /dev/null +++ b/network-area-diagram/src/test/resources/subnetwork_highlight.svg @@ -0,0 +1,446 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 606 + + + + + + + + + + + + -605 + + + + + + + + + + + + + + + + + + 302 + + + + + + + + + + + + -300 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 601 + + + + + + + + + + + + -600 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 100 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
VLGEN
+ + + + + +
+
+
24.5 kV / 2.3°
+
+
+ +
+
VLHV1
+ + + + + +
+
+
402.1 kV / 0.0°
+
+
+ +
+
VLHV2
+ + + + + +
+
+
390.0 kV / -3.5°
+
+
+ +
+
VLHV3
+ + + + + +
+
+
197.6 kV / 3.0°
+
+
+ +
+
VLHV4
+ + + + + +
+
+
197.6 kV / 3.0°
+
+
+ +
+
VLHV5
+ + + + + +
+
+
197.6 kV / 3.0°
+
+
+ +
+
VLLOAD
+ + + + + +
+
+
147.6 kV / -9.6°
+
+
+
+
diff --git a/network-area-diagram/src/test/resources/tie_line.svg b/network-area-diagram/src/test/resources/tie_line.svg index 146e07c02..101cfea9a 100644 --- a/network-area-diagram/src/test/resources/tie_line.svg +++ b/network-area-diagram/src/test/resources/tie_line.svg @@ -30,7 +30,12 @@ path.nad-arrow-in:not(.nad-state-in .nad-arrow-in) {visibility: hidden} .nad-branch-edges .nad-overload .nad-edge-path {animation: line-blink 3s infinite} .nad-vl-nodes .nad-overvoltage {animation: node-over-blink 3s infinite} .nad-vl-nodes .nad-undervoltage {animation: node-under-blink 3s infinite} - +.nad-highlight {stroke-width: 25; opacity: 0.2; fill: none;} +.nad-highlight-0 {stroke: #e6e600;} +.nad-highlight-1 {stroke: #b300b3;} +.nad-highlight-2 {stroke: #2eb82e;} +.nad-highlight-3 {stroke: #e67300;} +.nad-highlight-4 {stroke: #0000ff;} @keyframes line-blink { 0%, 80%, 100% {stroke: var(--nad-vl-color, black); stroke-width: 5} 40% {stroke: #FFEB3B; stroke-width: 15} diff --git a/network-area-diagram/src/test/resources/tie_line_filtered.svg b/network-area-diagram/src/test/resources/tie_line_filtered.svg index 07a0714d6..b2be8131a 100644 --- a/network-area-diagram/src/test/resources/tie_line_filtered.svg +++ b/network-area-diagram/src/test/resources/tie_line_filtered.svg @@ -30,7 +30,12 @@ path.nad-arrow-in:not(.nad-state-in .nad-arrow-in) {visibility: hidden} .nad-branch-edges .nad-overload .nad-edge-path {animation: line-blink 3s infinite} .nad-vl-nodes .nad-overvoltage {animation: node-over-blink 3s infinite} .nad-vl-nodes .nad-undervoltage {animation: node-under-blink 3s infinite} - +.nad-highlight {stroke-width: 25; opacity: 0.2; fill: none;} +.nad-highlight-0 {stroke: #e6e600;} +.nad-highlight-1 {stroke: #b300b3;} +.nad-highlight-2 {stroke: #2eb82e;} +.nad-highlight-3 {stroke: #e67300;} +.nad-highlight-4 {stroke: #0000ff;} @keyframes line-blink { 0%, 80%, 100% {stroke: var(--nad-vl-color, black); stroke-width: 5} 40% {stroke: #FFEB3B; stroke-width: 15} diff --git a/network-area-diagram/src/test/resources/vl_description_id.svg b/network-area-diagram/src/test/resources/vl_description_id.svg index f3f4eae34..696d5adf1 100644 --- a/network-area-diagram/src/test/resources/vl_description_id.svg +++ b/network-area-diagram/src/test/resources/vl_description_id.svg @@ -95,7 +95,12 @@ path.nad-arrow-in:not(.nad-state-in .nad-arrow-in) {visibility: hidden} .nad-branch-edges .nad-overload .nad-edge-path {animation: line-blink 3s infinite} .nad-vl-nodes .nad-overvoltage {animation: node-over-blink 3s infinite} .nad-vl-nodes .nad-undervoltage {animation: node-under-blink 3s infinite} - +.nad-highlight {stroke-width: 25; opacity: 0.2; fill: none;} +.nad-highlight-0 {stroke: #e6e600;} +.nad-highlight-1 {stroke: #b300b3;} +.nad-highlight-2 {stroke: #2eb82e;} +.nad-highlight-3 {stroke: #e67300;} +.nad-highlight-4 {stroke: #0000ff;} @keyframes line-blink { 0%, 80%, 100% {stroke: var(--nad-vl-color, black); stroke-width: 5} 40% {stroke: #FFEB3B; stroke-width: 15} diff --git a/network-area-diagram/src/test/resources/vl_description_substation.svg b/network-area-diagram/src/test/resources/vl_description_substation.svg index 7a8bcdf9b..ce1de5c33 100644 --- a/network-area-diagram/src/test/resources/vl_description_substation.svg +++ b/network-area-diagram/src/test/resources/vl_description_substation.svg @@ -95,7 +95,12 @@ path.nad-arrow-in:not(.nad-state-in .nad-arrow-in) {visibility: hidden} .nad-branch-edges .nad-overload .nad-edge-path {animation: line-blink 3s infinite} .nad-vl-nodes .nad-overvoltage {animation: node-over-blink 3s infinite} .nad-vl-nodes .nad-undervoltage {animation: node-under-blink 3s infinite} - +.nad-highlight {stroke-width: 25; opacity: 0.2; fill: none;} +.nad-highlight-0 {stroke: #e6e600;} +.nad-highlight-1 {stroke: #b300b3;} +.nad-highlight-2 {stroke: #2eb82e;} +.nad-highlight-3 {stroke: #e67300;} +.nad-highlight-4 {stroke: #0000ff;} @keyframes line-blink { 0%, 80%, 100% {stroke: var(--nad-vl-color, black); stroke-width: 5} 40% {stroke: #FFEB3B; stroke-width: 15} diff --git a/network-area-diagram/src/test/resources/vl_description_substation_id.svg b/network-area-diagram/src/test/resources/vl_description_substation_id.svg index abd0cc5a8..323759000 100644 --- a/network-area-diagram/src/test/resources/vl_description_substation_id.svg +++ b/network-area-diagram/src/test/resources/vl_description_substation_id.svg @@ -95,7 +95,12 @@ path.nad-arrow-in:not(.nad-state-in .nad-arrow-in) {visibility: hidden} .nad-branch-edges .nad-overload .nad-edge-path {animation: line-blink 3s infinite} .nad-vl-nodes .nad-overvoltage {animation: node-over-blink 3s infinite} .nad-vl-nodes .nad-undervoltage {animation: node-under-blink 3s infinite} - +.nad-highlight {stroke-width: 25; opacity: 0.2; fill: none;} +.nad-highlight-0 {stroke: #e6e600;} +.nad-highlight-1 {stroke: #b300b3;} +.nad-highlight-2 {stroke: #2eb82e;} +.nad-highlight-3 {stroke: #e67300;} +.nad-highlight-4 {stroke: #0000ff;} @keyframes line-blink { 0%, 80%, 100% {stroke: var(--nad-vl-color, black); stroke-width: 5} 40% {stroke: #FFEB3B; stroke-width: 15} diff --git a/network-area-diagram/src/test/resources/voltage_limits.svg b/network-area-diagram/src/test/resources/voltage_limits.svg index 911a4bf1c..747538116 100644 --- a/network-area-diagram/src/test/resources/voltage_limits.svg +++ b/network-area-diagram/src/test/resources/voltage_limits.svg @@ -30,7 +30,12 @@ path.nad-arrow-in:not(.nad-state-in .nad-arrow-in) {visibility: hidden} .nad-branch-edges .nad-overload .nad-edge-path {animation: line-blink 3s infinite} .nad-vl-nodes .nad-overvoltage {animation: node-over-blink 3s infinite} .nad-vl-nodes .nad-undervoltage {animation: node-under-blink 3s infinite} - +.nad-highlight {stroke-width: 25; opacity: 0.2; fill: none;} +.nad-highlight-0 {stroke: #e6e600;} +.nad-highlight-1 {stroke: #b300b3;} +.nad-highlight-2 {stroke: #2eb82e;} +.nad-highlight-3 {stroke: #e67300;} +.nad-highlight-4 {stroke: #0000ff;} @keyframes line-blink { 0%, 80%, 100% {stroke: var(--nad-vl-color, black); stroke-width: 5} 40% {stroke: #FFEB3B; stroke-width: 15}