Skip to content

Commit 57b246f

Browse files
committed
NAD: Use single foreignObject for all text nodes
Signed-off-by: Giovanni Ferrari <giovanni.ferrari@soft.it>
1 parent bb60a71 commit 57b246f

59 files changed

Lines changed: 553 additions & 1472 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

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

Lines changed: 30 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -638,8 +638,27 @@ private void drawHighlightedNode(XMLStreamWriter writer, VoltageLevelNode vlNode
638638
private void drawTextNodes(Graph graph, XMLStreamWriter writer) throws XMLStreamException {
639639
writer.writeStartElement(GROUP_ELEMENT_NAME);
640640
writer.writeAttribute(CLASS_ATTRIBUTE, StyleProvider.TEXT_NODES_CLASS);
641-
for (Pair<VoltageLevelNode, TextNode> nodePair : graph.getVoltageLevelTextPairs()) {
642-
writeTextNode(writer, nodePair.getSecond(), nodePair.getFirst(), labelProvider);
641+
List<Pair<VoltageLevelNode, TextNode>> simpleTextNodes = new ArrayList<>();
642+
List<Pair<VoltageLevelNode, TextNode>> detailedTextNodes = new ArrayList<>();
643+
graph.getVoltageLevelTextPairs().stream()
644+
.filter(nodePair -> nodePair.getSecond() != null)
645+
.forEach(nodePair -> {
646+
if (isDetailedTextNode(labelProvider.getVoltageLevelDescription(nodePair.getFirst()))) {
647+
detailedTextNodes.add(nodePair);
648+
} else {
649+
simpleTextNodes.add(nodePair);
650+
}
651+
});
652+
for (Pair<VoltageLevelNode, TextNode> nodePair : simpleTextNodes) {
653+
writeSimpleTextNode(writer, nodePair.getSecond(), labelProvider.getVoltageLevelDescription(nodePair.getFirst()));
654+
}
655+
if (!detailedTextNodes.isEmpty()) {
656+
TextNode firstNode = detailedTextNodes.get(0).getSecond();
657+
writeForeignObject(writer, firstNode);
658+
for (Pair<VoltageLevelNode, TextNode> nodePair : detailedTextNodes) {
659+
writeDetailedTextNode(writer, firstNode, nodePair.getSecond(), nodePair.getFirst(), labelProvider.getVoltageLevelDescription(nodePair.getFirst()));
660+
}
661+
writer.writeEndElement();
643662
}
644663
writer.writeEndElement();
645664
}
@@ -656,34 +675,27 @@ private String getTranslateString(double x, double y) {
656675
return "translate(" + getFormattedValue(x) + "," + getFormattedValue(y) + ")";
657676
}
658677

659-
private void writeTextNode(XMLStreamWriter writer, TextNode textNode, VoltageLevelNode vlNode, LabelProvider labelProvider) throws XMLStreamException {
660-
if (textNode == null) {
661-
return;
662-
}
663-
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-
}
678+
private boolean isDetailedTextNode(List<String> content) {
679+
return content.size() > 1 || svgParameters.isBusLegend() || svgParameters.isVoltageLevelDetails();
670680
}
671681

672-
private void writeDetailedTextNode(XMLStreamWriter writer, TextNode textNode, VoltageLevelNode vlNode, List<String> content) throws XMLStreamException {
682+
private void writeForeignObject(XMLStreamWriter writer, TextNode textNode) throws XMLStreamException {
673683
writer.writeStartElement(FOREIGN_OBJECT_ELEMENT_NAME);
674684
writeId(writer, textNode);
675685
writer.writeAttribute(Y_ATTRIBUTE, getFormattedValue(textNode.getY()));
676686
writer.writeAttribute(X_ATTRIBUTE, getFormattedValue(textNode.getX()));
677-
678-
// width and height cannot be set to auto, and object is of width and height 0 if not specified
679-
// using a fixed size of 1x1 and CSS {overflow: visible} to display it
680687
writer.writeAttribute(HEIGHT_ATTRIBUTE, "1");
681688
writer.writeAttribute(WIDTH_ATTRIBUTE, "1");
689+
}
682690

691+
private void writeDetailedTextNode(XMLStreamWriter writer, TextNode firstNode, TextNode textNode, VoltageLevelNode vlNode, List<String> content) throws XMLStreamException {
683692
writer.writeStartElement("", DIV_ELEMENT_NAME, XHTML_NAMESPACE_URI);
684693
writer.writeDefaultNamespace(XHTML_NAMESPACE_URI);
685694
writer.writeAttribute(CLASS_ATTRIBUTE, StyleProvider.LABEL_BOX_CLASS);
686-
695+
long top = Math.round(textNode.getY() - firstNode.getY());
696+
long left = Math.round(textNode.getX() - firstNode.getX());
697+
writeStyleAttribute(writer, String.format("position: absolute; top: %spx; left: %spx", top, left));
698+
writeId(writer, textNode);
687699
writeLines(content, writer);
688700

689701
if (svgParameters.isBusLegend()) {
@@ -695,7 +707,6 @@ private void writeDetailedTextNode(XMLStreamWriter writer, TextNode textNode, Vo
695707
}
696708

697709
writer.writeEndElement();
698-
writer.writeEndElement();
699710
}
700711

701712
private void writeLines(List<String> lines, XMLStreamWriter writer) throws XMLStreamException {

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

Lines changed: 3 additions & 7 deletions
Loading

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

Lines changed: 3 additions & 7 deletions
Loading

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

Lines changed: 3 additions & 7 deletions
Loading

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

Lines changed: 3 additions & 7 deletions
Loading

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

Lines changed: 1 addition & 1 deletion
Loading

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

Lines changed: 1 addition & 1 deletion
Loading

0 commit comments

Comments
 (0)