Skip to content

Commit 16f3393

Browse files
committed
Merge branch 'main' into 684-nad-single-foreignobject
Signed-off-by: Giovanni Ferrari <giovanni.ferrari@soft.it>
2 parents c54059d + 9d06de7 commit 16f3393

8 files changed

Lines changed: 86 additions & 108 deletions

File tree

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

Lines changed: 35 additions & 73 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
}
@@ -636,26 +630,16 @@ private void drawHighlightedNode(XMLStreamWriter writer, VoltageLevelNode vlNode
636630
}
637631

638632
private void drawTextNodes(Graph graph, XMLStreamWriter writer) throws XMLStreamException {
639-
List<Pair<VoltageLevelNode, TextNode>> simpleTextNodes = new ArrayList<>();
640-
List<Pair<VoltageLevelNode, TextNode>> detailedTextNodes = new ArrayList<>();
641-
graph.getVoltageLevelTextPairs().stream()
633+
List<Pair<VoltageLevelNode, TextNode>> textNodes = graph.getVoltageLevelTextPairs().stream()
642634
.filter(nodePair -> nodePair.getSecond() != null)
643-
.forEach(nodePair -> {
644-
if (isDetailedTextNode(labelProvider.getVoltageLevelDescription(nodePair.getFirst()))) {
645-
detailedTextNodes.add(nodePair);
646-
} else {
647-
simpleTextNodes.add(nodePair);
648-
}
649-
});
650-
for (Pair<VoltageLevelNode, TextNode> nodePair : simpleTextNodes) {
651-
writeSimpleTextNode(writer, nodePair.getSecond(), labelProvider.getVoltageLevelDescription(nodePair.getFirst()));
652-
}
653-
if (!detailedTextNodes.isEmpty()) {
635+
.toList();
636+
637+
if (!textNodes.isEmpty()) {
654638
writeForeignObject(writer);
655639
writer.writeStartElement("", DIV_ELEMENT_NAME, XHTML_NAMESPACE_URI);
656640
writer.writeDefaultNamespace(XHTML_NAMESPACE_URI);
657-
for (Pair<VoltageLevelNode, TextNode> nodePair : detailedTextNodes) {
658-
writeDetailedTextNode(writer, nodePair.getSecond(), nodePair.getFirst(), labelProvider.getVoltageLevelDescription(nodePair.getFirst()));
641+
for (Pair<VoltageLevelNode, TextNode> nodePair : textNodes) {
642+
writeDetailedTextNode(writer, nodePair.getSecond(), nodePair.getFirst());
659643
}
660644
writer.writeEndElement();
661645
writer.writeEndElement();
@@ -674,33 +658,28 @@ private String getTranslateString(double x, double y) {
674658
return "translate(" + getFormattedValue(x) + "," + getFormattedValue(y) + ")";
675659
}
676660

677-
private boolean isDetailedTextNode(List<String> content) {
678-
return content.size() > 1 || svgParameters.isBusLegend() || svgParameters.isVoltageLevelDetails();
679-
}
680-
681661
private void writeForeignObject(XMLStreamWriter writer) throws XMLStreamException {
682662
writer.writeStartElement(FOREIGN_OBJECT_ELEMENT_NAME);
683663
writer.writeAttribute(HEIGHT_ATTRIBUTE, "1");
684664
writer.writeAttribute(WIDTH_ATTRIBUTE, "1");
685665
writeStyleClasses(writer, StyleProvider.TEXT_NODES_CLASS);
686666
}
687667

688-
private void writeDetailedTextNode(XMLStreamWriter writer, TextNode textNode, VoltageLevelNode vlNode, List<String> content) throws XMLStreamException {
668+
private void writeDetailedTextNode(XMLStreamWriter writer, TextNode textNode, VoltageLevelNode vlNode) throws XMLStreamException {
689669
writer.writeStartElement("", DIV_ELEMENT_NAME, XHTML_NAMESPACE_URI);
690670
writer.writeAttribute(CLASS_ATTRIBUTE, StyleProvider.LABEL_BOX_CLASS);
691671
long top = Math.round(textNode.getY());
692672
long left = Math.round(textNode.getX());
693673
writeStyleAttribute(writer, String.format("position: absolute; top: %spx; left: %spx", top, left));
694674
writeId(writer, textNode);
695-
writeLines(content, writer);
696675

697-
if (svgParameters.isBusLegend()) {
698-
writeBusNodeLegend(writer, vlNode);
699-
}
676+
List<String> vlDescription = labelProvider.getVoltageLevelDescription(vlNode);
677+
writeLines(vlDescription, writer);
700678

701-
if (svgParameters.isVoltageLevelDetails()) {
702-
writeLines(labelProvider.getVoltageLevelDetails(vlNode), writer);
703-
}
679+
writeBusNodeLegend(writer, vlNode);
680+
681+
List<String> vlDetails = labelProvider.getVoltageLevelDetails(vlNode);
682+
writeLines(vlDetails, writer);
704683

705684
writer.writeEndElement();
706685
}
@@ -714,43 +693,26 @@ private void writeLines(List<String> lines, XMLStreamWriter writer) throws XMLSt
714693
}
715694

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

756718
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)