Skip to content

Commit 1f0d2c4

Browse files
committed
Merge branch 'main' into 685-nad-css-tables-in-text-boxes
Signed-off-by: Giovanni Ferrari <giovanni.ferrari@soft.it>
2 parents 6d0146c + 9d06de7 commit 1f0d2c4

5 files changed

Lines changed: 65 additions & 82 deletions

File tree

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

Lines changed: 14 additions & 50 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 SPAN_ELEMENT_NAME = "span";
@@ -56,7 +55,6 @@ public class SvgWriter {
5655
private static final String PATH_D_ATTRIBUTE = "d";
5756
private static final String X_ATTRIBUTE = "x";
5857
private static final String Y_ATTRIBUTE = "y";
59-
private static final String DY_ATTRIBUTE = "dy";
6058
private static final String POINTS_ATTRIBUTE = "points";
6159
private static final String HREF_ATTRIBUTE = "href";
6260

@@ -156,9 +154,7 @@ private void drawHighlightBranchEdges(Graph graph, XMLStreamWriter writer) throw
156154
writer.writeEndElement();
157155
}
158156

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

163159
if (edgeLabel == null || edgeLabel.isEmpty()) {
164160
return;
@@ -202,11 +198,11 @@ private void drawEdgeCenter(XMLStreamWriter writer, BranchEdge edge) throws XMLS
202198
if (BranchEdge.DANGLING_LINE_EDGE.equals(edge.getType())) {
203199
return;
204200
}
205-
if (!BranchEdge.LINE_EDGE.equals(edge.getType()) || svgParameters.isEdgeNameDisplayed()) {
201+
String edgeLabel = labelProvider.getLabel(edge);
202+
if (!BranchEdge.LINE_EDGE.equals(edge.getType()) || !StringUtils.isEmpty(edgeLabel)) {
206203
writer.writeStartElement(GROUP_ELEMENT_NAME);
207204
switch (edge.getType()) {
208-
case BranchEdge.PST_EDGE:
209-
case BranchEdge.TWO_WT_EDGE:
205+
case BranchEdge.PST_EDGE, BranchEdge.TWO_WT_EDGE:
210206
draw2Wt(writer, edge);
211207
break;
212208
case BranchEdge.HVDC_LINE_EDGE:
@@ -215,9 +211,7 @@ private void drawEdgeCenter(XMLStreamWriter writer, BranchEdge edge) throws XMLS
215211
default:
216212
break;
217213
}
218-
if (svgParameters.isEdgeNameDisplayed()) {
219-
drawEdgeLabel(writer, edge);
220-
}
214+
drawEdgeLabel(writer, edge, edgeLabel);
221215
writer.writeEndElement();
222216
}
223217
}
@@ -659,15 +653,6 @@ private void writeTextNode(XMLStreamWriter writer, TextNode textNode, VoltageLev
659653
return;
660654
}
661655

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

685-
writeLines(content, writer);
670+
List<String> vlDescription = labelProvider.getVoltageLevelDescription(vlNode);
671+
writeLines(vlDescription, writer);
686672

687-
if (svgParameters.isBusLegend()) {
688-
writeBusNodeLegend(writer, vlNode);
689-
}
673+
writeBusNodeLegend(writer, vlNode);
690674

691-
if (svgParameters.isVoltageLevelDetails()) {
692-
writeLines(labelProvider.getVoltageLevelDetails(vlNode), writer);
693-
}
675+
List<String> vlDetails = labelProvider.getVoltageLevelDetails(vlNode);
676+
writeLines(vlDetails, writer);
694677

695678
writer.writeEndElement();
696679
writer.writeEndElement();
@@ -705,7 +688,10 @@ private void writeLines(List<String> lines, XMLStreamWriter writer) throws XMLSt
705688
}
706689

707690
private void writeBusNodeLegend(XMLStreamWriter writer, VoltageLevelNode vlNode) throws XMLStreamException {
708-
for (BusNode busNode : vlNode.getBusNodes()) {
691+
List<BusNode> notEmptyDescrBusNodes = vlNode.getBusNodeStream()
692+
.filter(busNode -> StringUtils.isNotEmpty(labelProvider.getBusDescription(busNode)))
693+
.toList();
694+
for (BusNode busNode : notEmptyDescrBusNodes) {
709695
writer.writeStartElement(DIV_ELEMENT_NAME);
710696
writer.writeEmptyElement(SPAN_ELEMENT_NAME);
711697
writeStyleClasses(writer, styleProvider.getBusNodeStyleClasses(busNode), StyleProvider.LEGEND_SQUARE_CLASS);
@@ -715,28 +701,6 @@ private void writeBusNodeLegend(XMLStreamWriter writer, VoltageLevelNode vlNode)
715701
}
716702
}
717703

718-
private void writeSimpleTextNode(XMLStreamWriter writer, TextNode textNode, List<String> content) throws XMLStreamException {
719-
writer.writeStartElement(TEXT_ELEMENT_NAME);
720-
writeId(writer, textNode);
721-
writer.writeAttribute(Y_ATTRIBUTE, getFormattedValue(textNode.getEdgeConnection().getY()));
722-
if (content.size() == 1) {
723-
writer.writeAttribute(X_ATTRIBUTE, getFormattedValue(textNode.getEdgeConnection().getX()));
724-
writer.writeCharacters(content.get(0));
725-
} else {
726-
for (int i = 0; i < content.size(); i++) {
727-
String line = content.get(i);
728-
writer.writeStartElement(TSPAN_ELEMENT_NAME);
729-
writer.writeAttribute(X_ATTRIBUTE, getFormattedValue(textNode.getEdgeConnection().getX()));
730-
if (i > 0) {
731-
writer.writeAttribute(DY_ATTRIBUTE, "1.1em");
732-
}
733-
writer.writeCharacters(line);
734-
writer.writeEndElement();
735-
}
736-
}
737-
writer.writeEndElement();
738-
}
739-
740704
private void drawNode(Graph graph, XMLStreamWriter writer, VoltageLevelNode vlNode) throws XMLStreamException {
741705
writeId(writer, vlNode);
742706
writeStyleClasses(writer, styleProvider.getNodeStyleClasses(vlNode));

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/vl_description_id.svg

Lines changed: 10 additions & 2 deletions
Loading

0 commit comments

Comments
 (0)