Skip to content

Commit 9d06de7

Browse files
authored
[NAD] Move some svg parmeters from SvgWriter to the DefaultLabelProvider (#692)
* moves some NAD svg parameters checking from svgwriter to the LabelProvider * removes the simple rendering mode for VL text nodes Signed-off-by: Christian Biasuzzi <christian.biasuzzi@soft.it>
1 parent bb60a71 commit 9d06de7

8 files changed

Lines changed: 78 additions & 96 deletions

File tree

network-area-diagram/src/main/java/com/powsybl/nad/svg/SvgWriter.java

Lines changed: 27 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,6 @@ public class SvgWriter {
3939
private static final String PATH_ELEMENT_NAME = "path";
4040
private static final String CIRCLE_ELEMENT_NAME = "circle";
4141
private static final String TEXT_ELEMENT_NAME = "text";
42-
private static final String TSPAN_ELEMENT_NAME = "tspan";
4342
private static final String FOREIGN_OBJECT_ELEMENT_NAME = "foreignObject";
4443
private static final String DIV_ELEMENT_NAME = "div";
4544
private static final String TABLE_ELEMENT_NAME = "table";
@@ -58,7 +57,6 @@ public class SvgWriter {
5857
private static final String PATH_D_ATTRIBUTE = "d";
5958
private static final String X_ATTRIBUTE = "x";
6059
private static final String Y_ATTRIBUTE = "y";
61-
private static final String DY_ATTRIBUTE = "dy";
6260
private static final String POINTS_ATTRIBUTE = "points";
6361
private static final String HREF_ATTRIBUTE = "href";
6462

@@ -158,9 +156,7 @@ private void drawHighlightBranchEdges(Graph graph, XMLStreamWriter writer) throw
158156
writer.writeEndElement();
159157
}
160158

161-
private void drawEdgeLabel(XMLStreamWriter writer, BranchEdge edge) throws XMLStreamException {
162-
163-
String edgeLabel = labelProvider.getLabel(edge);
159+
private void drawEdgeLabel(XMLStreamWriter writer, BranchEdge edge, String edgeLabel) throws XMLStreamException {
164160

165161
if (edgeLabel == null || edgeLabel.isEmpty()) {
166162
return;
@@ -204,11 +200,11 @@ private void drawEdgeCenter(XMLStreamWriter writer, BranchEdge edge) throws XMLS
204200
if (BranchEdge.DANGLING_LINE_EDGE.equals(edge.getType())) {
205201
return;
206202
}
207-
if (!BranchEdge.LINE_EDGE.equals(edge.getType()) || svgParameters.isEdgeNameDisplayed()) {
203+
String edgeLabel = labelProvider.getLabel(edge);
204+
if (!BranchEdge.LINE_EDGE.equals(edge.getType()) || !StringUtils.isEmpty(edgeLabel)) {
208205
writer.writeStartElement(GROUP_ELEMENT_NAME);
209206
switch (edge.getType()) {
210-
case BranchEdge.PST_EDGE:
211-
case BranchEdge.TWO_WT_EDGE:
207+
case BranchEdge.PST_EDGE, BranchEdge.TWO_WT_EDGE:
212208
draw2Wt(writer, edge);
213209
break;
214210
case BranchEdge.HVDC_LINE_EDGE:
@@ -217,9 +213,7 @@ private void drawEdgeCenter(XMLStreamWriter writer, BranchEdge edge) throws XMLS
217213
default:
218214
break;
219215
}
220-
if (svgParameters.isEdgeNameDisplayed()) {
221-
drawEdgeLabel(writer, edge);
222-
}
216+
drawEdgeLabel(writer, edge, edgeLabel);
223217
writer.writeEndElement();
224218
}
225219
}
@@ -661,15 +655,6 @@ private void writeTextNode(XMLStreamWriter writer, TextNode textNode, VoltageLev
661655
return;
662656
}
663657

664-
List<String> content = labelProvider.getVoltageLevelDescription(vlNode);
665-
if (content.size() > 1 || svgParameters.isBusLegend() || svgParameters.isVoltageLevelDetails()) {
666-
writeDetailedTextNode(writer, textNode, vlNode, content);
667-
} else {
668-
writeSimpleTextNode(writer, textNode, content);
669-
}
670-
}
671-
672-
private void writeDetailedTextNode(XMLStreamWriter writer, TextNode textNode, VoltageLevelNode vlNode, List<String> content) throws XMLStreamException {
673658
writer.writeStartElement(FOREIGN_OBJECT_ELEMENT_NAME);
674659
writeId(writer, textNode);
675660
writer.writeAttribute(Y_ATTRIBUTE, getFormattedValue(textNode.getY()));
@@ -684,15 +669,13 @@ private void writeDetailedTextNode(XMLStreamWriter writer, TextNode textNode, Vo
684669
writer.writeDefaultNamespace(XHTML_NAMESPACE_URI);
685670
writer.writeAttribute(CLASS_ATTRIBUTE, StyleProvider.LABEL_BOX_CLASS);
686671

687-
writeLines(content, writer);
672+
List<String> vlDescription = labelProvider.getVoltageLevelDescription(vlNode);
673+
writeLines(vlDescription, writer);
688674

689-
if (svgParameters.isBusLegend()) {
690-
writeBusNodeLegend(writer, vlNode);
691-
}
675+
writeBusNodeLegend(writer, vlNode);
692676

693-
if (svgParameters.isVoltageLevelDetails()) {
694-
writeLines(labelProvider.getVoltageLevelDetails(vlNode), writer);
695-
}
677+
List<String> vlDetails = labelProvider.getVoltageLevelDetails(vlNode);
678+
writeLines(vlDetails, writer);
696679

697680
writer.writeEndElement();
698681
writer.writeEndElement();
@@ -707,43 +690,26 @@ private void writeLines(List<String> lines, XMLStreamWriter writer) throws XMLSt
707690
}
708691

709692
private void writeBusNodeLegend(XMLStreamWriter writer, VoltageLevelNode vlNode) throws XMLStreamException {
710-
writer.writeStartElement(TABLE_ELEMENT_NAME);
711-
712-
for (BusNode busNode : vlNode.getBusNodes()) {
713-
writer.writeStartElement(TABLE_ROW_ELEMENT_NAME);
714-
writer.writeStartElement(TABLE_DATA_ELEMENT_NAME);
715-
writer.writeEmptyElement(DIV_ELEMENT_NAME);
716-
writeStyleClasses(writer, styleProvider.getBusNodeStyleClasses(busNode), StyleProvider.LEGEND_SQUARE_CLASS);
717-
writeStyleAttribute(writer, styleProvider.getBusNodeStyle(busNode));
718-
writer.writeEndElement();
719-
writer.writeStartElement(TABLE_DATA_ELEMENT_NAME);
720-
writer.writeCharacters(labelProvider.getBusDescription(busNode));
721-
writer.writeEndElement();
722-
writer.writeEndElement();
723-
}
724-
writer.writeEndElement();
725-
}
726-
727-
private void writeSimpleTextNode(XMLStreamWriter writer, TextNode textNode, List<String> content) throws XMLStreamException {
728-
writer.writeStartElement(TEXT_ELEMENT_NAME);
729-
writeId(writer, textNode);
730-
writer.writeAttribute(Y_ATTRIBUTE, getFormattedValue(textNode.getEdgeConnection().getY()));
731-
if (content.size() == 1) {
732-
writer.writeAttribute(X_ATTRIBUTE, getFormattedValue(textNode.getEdgeConnection().getX()));
733-
writer.writeCharacters(content.get(0));
734-
} else {
735-
for (int i = 0; i < content.size(); i++) {
736-
String line = content.get(i);
737-
writer.writeStartElement(TSPAN_ELEMENT_NAME);
738-
writer.writeAttribute(X_ATTRIBUTE, getFormattedValue(textNode.getEdgeConnection().getX()));
739-
if (i > 0) {
740-
writer.writeAttribute(DY_ATTRIBUTE, "1.1em");
741-
}
742-
writer.writeCharacters(line);
693+
List<BusNode> notEmptyDescrBusNodes = vlNode.getBusNodeStream()
694+
.filter(busNode -> StringUtils.isNotEmpty(labelProvider.getBusDescription(busNode)))
695+
.toList();
696+
697+
if (!notEmptyDescrBusNodes.isEmpty()) {
698+
writer.writeStartElement(TABLE_ELEMENT_NAME);
699+
for (BusNode busNode : notEmptyDescrBusNodes) {
700+
writer.writeStartElement(TABLE_ROW_ELEMENT_NAME);
701+
writer.writeStartElement(TABLE_DATA_ELEMENT_NAME);
702+
writer.writeEmptyElement(DIV_ELEMENT_NAME);
703+
writeStyleClasses(writer, styleProvider.getBusNodeStyleClasses(busNode), StyleProvider.LEGEND_SQUARE_CLASS);
704+
writeStyleAttribute(writer, styleProvider.getBusNodeStyle(busNode));
705+
writer.writeEndElement();
706+
writer.writeStartElement(TABLE_DATA_ELEMENT_NAME);
707+
writer.writeCharacters(labelProvider.getBusDescription(busNode));
708+
writer.writeEndElement();
743709
writer.writeEndElement();
744710
}
711+
writer.writeEndElement();
745712
}
746-
writer.writeEndElement();
747713
}
748714

749715
private void drawNode(Graph graph, XMLStreamWriter writer, VoltageLevelNode vlNode) throws XMLStreamException {

network-area-diagram/src/main/java/com/powsybl/nad/svg/iidm/DefaultLabelProvider.java

Lines changed: 25 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ public Optional<EdgeInfo> getEdgeInfo(Graph graph, ThreeWtEdge edge) {
5252

5353
@Override
5454
public String getLabel(Edge edge) {
55-
return edge.getEquipmentId();
55+
return svgParameters.isEdgeNameDisplayed() ? edge.getEquipmentId() : null;
5656
}
5757

5858
private Optional<EdgeInfo> getEdgeInfo(Terminal terminal) {
@@ -86,35 +86,41 @@ public List<String> getVoltageLevelDescription(VoltageLevelNode voltageLevelNode
8686

8787
@Override
8888
public String getBusDescription(BusNode busNode) {
89-
Bus b = network.getBusView().getBus(busNode.getEquipmentId());
90-
String voltage = valueFormatter.formatVoltage(b.getV(), "kV");
91-
String angle = valueFormatter.formatAngleInDegrees(b.getAngle());
92-
return voltage + " / " + angle;
89+
if (svgParameters.isBusLegend()) {
90+
Bus b = network.getBusView().getBus(busNode.getEquipmentId());
91+
String voltage = valueFormatter.formatVoltage(b.getV(), "kV");
92+
String angle = valueFormatter.formatAngleInDegrees(b.getAngle());
93+
return voltage + " / " + angle;
94+
}
95+
return null;
9396
}
9497

9598
@Override
9699
public List<String> getVoltageLevelDetails(VoltageLevelNode vlNode) {
97100
List<String> voltageLevelDetails = new ArrayList<>();
98-
VoltageLevel voltageLevel = network.getVoltageLevel(vlNode.getEquipmentId());
99101

100-
double activeProductionValue = voltageLevel.getGeneratorStream().mapToDouble(generator -> -generator.getTerminal().getP()).filter(p -> !Double.isNaN(p)).sum();
101-
String activeProduction = activeProductionValue == 0 ? "" : valueFormatter.formatPower(activeProductionValue, "MW");
102+
if (svgParameters.isVoltageLevelDetails()) {
103+
VoltageLevel voltageLevel = network.getVoltageLevel(vlNode.getEquipmentId());
102104

103-
double reactiveProductionValue = voltageLevel.getGeneratorStream().mapToDouble(generator -> -generator.getTerminal().getQ()).filter(q -> !Double.isNaN(q)).sum();
104-
String reactiveProduction = reactiveProductionValue == 0 ? "" : valueFormatter.formatPower(reactiveProductionValue, "MVAR");
105+
double activeProductionValue = voltageLevel.getGeneratorStream().mapToDouble(generator -> -generator.getTerminal().getP()).filter(p -> !Double.isNaN(p)).sum();
106+
String activeProduction = activeProductionValue == 0 ? "" : valueFormatter.formatPower(activeProductionValue, "MW");
105107

106-
double activeConsumptionValue = voltageLevel.getLoadStream().mapToDouble(load -> load.getTerminal().getP()).filter(p -> !Double.isNaN(p)).sum();
107-
String activeConsumption = activeConsumptionValue == 0 ? "" : valueFormatter.formatPower(activeConsumptionValue, "MW");
108+
double reactiveProductionValue = voltageLevel.getGeneratorStream().mapToDouble(generator -> -generator.getTerminal().getQ()).filter(q -> !Double.isNaN(q)).sum();
109+
String reactiveProduction = reactiveProductionValue == 0 ? "" : valueFormatter.formatPower(reactiveProductionValue, "MVAR");
108110

109-
double reactiveConsumptionValue = voltageLevel.getLoadStream().mapToDouble(load -> load.getTerminal().getQ()).filter(q -> !Double.isNaN(q)).sum();
110-
String reactiveConsumption = reactiveConsumptionValue == 0 ? "" : valueFormatter.formatPower(reactiveConsumptionValue, "MVAR");
111+
double activeConsumptionValue = voltageLevel.getLoadStream().mapToDouble(load -> load.getTerminal().getP()).filter(p -> !Double.isNaN(p)).sum();
112+
String activeConsumption = activeConsumptionValue == 0 ? "" : valueFormatter.formatPower(activeConsumptionValue, "MW");
111113

112-
if (!activeProduction.isEmpty() || !reactiveProduction.isEmpty()) {
113-
voltageLevelDetails.add(String.format("~ %s / %s", activeProduction, reactiveProduction));
114-
}
114+
double reactiveConsumptionValue = voltageLevel.getLoadStream().mapToDouble(load -> load.getTerminal().getQ()).filter(q -> !Double.isNaN(q)).sum();
115+
String reactiveConsumption = reactiveConsumptionValue == 0 ? "" : valueFormatter.formatPower(reactiveConsumptionValue, "MVAR");
116+
117+
if (!activeProduction.isEmpty() || !reactiveProduction.isEmpty()) {
118+
voltageLevelDetails.add(String.format("~ %s / %s", activeProduction, reactiveProduction));
119+
}
115120

116-
if (!activeConsumption.isEmpty() || !reactiveConsumption.isEmpty()) {
117-
voltageLevelDetails.add(String.format("⌂ %s / %s", activeConsumption, reactiveConsumption));
121+
if (!activeConsumption.isEmpty() || !reactiveConsumption.isEmpty()) {
122+
voltageLevelDetails.add(String.format("⌂ %s / %s", activeConsumption, reactiveConsumption));
123+
}
118124
}
119125

120126
return voltageLevelDetails;

network-area-diagram/src/test/java/com/powsybl/nad/svg/CustomLabelProviderTest.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -31,14 +31,14 @@ class CustomLabelProviderTest extends AbstractTest {
3131
void setup() {
3232
setLayoutParameters(new LayoutParameters());
3333

34-
//Note: SvgParameters EdgeNameDisplayed, VoltageLevelDetails, and BusLegend must be true,
35-
// for the edge names, the VL descriptions plus VL details, and bus descriptions to be rendered
34+
//Note: sets SvgParameters EdgeNameDisplayed, VoltageLevelDetails, and BusLegend explicitly to false, to demonstrate that
35+
// the custom label provider ignores them when rendering edge names, the VL descriptions, and VL details.
3636
setSvgParameters(new SvgParameters()
3737
.setSvgWidthAndHeightAdded(true)
3838
.setFixedWidth(800)
39-
.setEdgeNameDisplayed(true)
40-
.setVoltageLevelDetails(true)
41-
.setBusLegend(true));
39+
.setEdgeNameDisplayed(false)
40+
.setVoltageLevelDetails(false)
41+
.setBusLegend(false));
4242
}
4343

4444
@Override

network-area-diagram/src/test/java/com/powsybl/nad/svg/TextNodeTest.java

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import org.junit.jupiter.api.BeforeEach;
1818
import org.junit.jupiter.api.Test;
1919

20+
import java.util.Collections;
2021
import java.util.List;
2122

2223
/**
@@ -47,12 +48,16 @@ protected LabelProvider getLabelProvider(Network network) {
4748
return new DefaultLabelProvider(network, getSvgParameters()) {
4849
@Override
4950
public List<String> getVoltageLevelDetails(VoltageLevelNode vlNode) {
50-
VoltageLevel vl = network.getVoltageLevel(vlNode.getEquipmentId());
51-
return List.of(
52-
vl.getLoadCount() + " loads",
53-
vl.getGeneratorCount() + " generators",
54-
vl.getBatteryCount() + " batteries",
55-
vl.getDanglingLineCount() + " dangling lines");
51+
if (getSvgParameters().isVoltageLevelDetails()) {
52+
VoltageLevel vl = network.getVoltageLevel(vlNode.getEquipmentId());
53+
return List.of(
54+
vl.getLoadCount() + " loads",
55+
vl.getGeneratorCount() + " generators",
56+
vl.getBatteryCount() + " batteries",
57+
vl.getDanglingLineCount() + " dangling lines");
58+
} else {
59+
return Collections.emptyList();
60+
}
5661
}
5762
};
5863
}

network-area-diagram/src/test/resources/3wt_disconnected.svg

Lines changed: 0 additions & 1 deletion
Loading

network-area-diagram/src/test/resources/3wt_disconnected_topological.svg

Lines changed: 0 additions & 1 deletion
Loading

network-area-diagram/src/test/resources/IEEE_14_bus_disconnection.svg

Lines changed: 0 additions & 1 deletion
Loading

network-area-diagram/src/test/resources/vl_description_id.svg

Lines changed: 10 additions & 2 deletions
Loading

0 commit comments

Comments
 (0)