Skip to content

Commit

Permalink
Allow to provide fixed text node positions as input to network area d…
Browse files Browse the repository at this point in the history
…iagram layouts (powsybl#637)

Signed-off-by: massimo.ferraro <[email protected]>
  • Loading branch information
massimo-ferraro authored Aug 1, 2024
1 parent c10dbd4 commit 04c0676
Show file tree
Hide file tree
Showing 63 changed files with 245 additions and 135 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,10 @@ public abstract class AbstractLayout implements Layout {

private Map<String, Point> initialNodePositions = Collections.emptyMap();
private Set<String> nodesWithFixedPosition = Collections.emptySet();
private Map<String, TextPosition> textNodesWithFixedPosition = new HashMap<>();

record TextPosition(Point topLeftPosition, Point edgeConnection) {
}

@Override
public void run(Graph graph, LayoutParameters layoutParameters) {
Expand Down Expand Up @@ -54,6 +58,14 @@ public Set<String> getNodesWithFixedPosition() {
return nodesWithFixedPosition;
}

@Override
public void setTextNodeFixedPosition(String voltageLevelId, Point topLeft, Point edgeConnection) {
Objects.requireNonNull(voltageLevelId);
Objects.requireNonNull(topLeft);
Objects.requireNonNull(edgeConnection);
textNodesWithFixedPosition.put(voltageLevelId, new TextPosition(topLeft, edgeConnection));
}

public void setFixedNodePositions(Map<String, Point> fixedNodePositions) {
setInitialNodePositions(fixedNodePositions);
setNodesWithFixedPosition(fixedNodePositions.keySet());
Expand All @@ -76,9 +88,14 @@ protected void busNodesLayout(Graph graph) {
}

protected void fixedTextNodeLayout(Pair<VoltageLevelNode, TextNode> nodes, LayoutParameters layoutParameters) {
Point fixedShift = layoutParameters.getTextNodeFixedShift();
Point textPos = nodes.getFirst().getPosition().shift(fixedShift.getX(), fixedShift.getY());
nodes.getSecond().setPosition(textPos);
TextPosition fixedTextPosition = textNodesWithFixedPosition.get(nodes.getFirst().getEquipmentId());
Point textShift = fixedTextPosition != null ? fixedTextPosition.topLeftPosition() : layoutParameters.getTextNodeFixedShift();
Point textPosition = nodes.getFirst().getPosition().shift(textShift.getX(), textShift.getY());
Point connectionShift = fixedTextPosition != null ? fixedTextPosition.edgeConnection() :
new Point(layoutParameters.getTextNodeFixedShift().getX(), layoutParameters.getTextNodeFixedShift().getY() + layoutParameters.getTextNodeEdgeConnectionYShift());
Point edgeConnection = nodes.getFirst().getPosition().shift(connectionShift.getX(), connectionShift.getY());
nodes.getSecond().setPosition(textPosition);
nodes.getSecond().setEdgeConnection(edgeConnection);
}

protected void edgesLayout(Graph graph, LayoutParameters layoutParameters) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@
import com.powsybl.nad.model.Edge;
import com.powsybl.nad.model.Graph;
import com.powsybl.nad.model.Node;
import com.powsybl.nad.model.Point;
import com.powsybl.nad.model.TextNode;

import java.util.Map;
import java.util.Optional;
Expand Down Expand Up @@ -56,7 +58,12 @@ protected void nodesLayout(Graph graph, LayoutParameters layoutParameters) {

jgraphtGraph.vertexSet().forEach(node -> {
Vector p = forceLayout.getStablePosition(node);
node.setPosition(SCALE * p.getX(), SCALE * p.getY());
if (node instanceof TextNode texNode) {
texNode.setPosition(SCALE * p.getX(), SCALE * p.getY() - layoutParameters.getTextNodeEdgeConnectionYShift());
texNode.setEdgeConnection(new Point(SCALE * p.getX(), SCALE * p.getY()));
} else {
node.setPosition(SCALE * p.getX(), SCALE * p.getY());
}
});

if (!layoutParameters.isTextNodesForceLayout()) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,4 +25,6 @@ public interface Layout {
Map<String, Point> getInitialNodePositions();

Set<String> getNodesWithFixedPosition();

void setTextNodeFixedPosition(String voltageLevelId, Point topLeft, Point edgeConnection);
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,9 @@
public class LayoutParameters {
private boolean textNodesForceLayout = false;
private double springRepulsionFactorForceLayout = 0.0;
private Point textNodeFixedShift = new Point(100, -15);
private Point textNodeFixedShift = new Point(100, -40);
private int maxSteps = 1000;
private double textNodeEdgeConnectionYShift = 25;

public LayoutParameters() {
}
Expand All @@ -25,6 +26,7 @@ public LayoutParameters(LayoutParameters other) {
this.springRepulsionFactorForceLayout = other.springRepulsionFactorForceLayout;
this.textNodeFixedShift = new Point(other.textNodeFixedShift.getX(), other.textNodeFixedShift.getY());
this.maxSteps = other.maxSteps;
this.textNodeEdgeConnectionYShift = other.textNodeEdgeConnectionYShift;
}

public boolean isTextNodesForceLayout() {
Expand Down Expand Up @@ -62,4 +64,13 @@ public LayoutParameters setMaxSteps(int maxSteps) {
this.maxSteps = maxSteps;
return this;
}

public double getTextNodeEdgeConnectionYShift() {
return textNodeEdgeConnectionYShift;
}

public LayoutParameters setTextNodeEdgeConnectionYShift(double textNodeEdgeConnectionYShift) {
this.textNodeEdgeConnectionYShift = textNodeEdgeConnectionYShift;
return this;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,18 @@
*/
public class TextNode extends AbstractNode {

private Point edgeConnection;

public TextNode(String diagramId) {
super(diagramId, null, null);
edgeConnection = new Point();
}

public Point getEdgeConnection() {
return edgeConnection;
}

public void setEdgeConnection(Point edgeConnection) {
this.edgeConnection = edgeConnection;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,8 @@ public void run(Graph graph, SvgParameters svgParameters) {
graph.getTextEdgesMap().forEach((edge, nodes) -> computeTextEdgeLayoutCoordinates(nodes.getFirst(), nodes.getSecond(), edge));
}

private void computeTextEdgeLayoutCoordinates(Node node1, Node node2, TextEdge edge) {
edge.setPoints(node1.getPosition(), node2.getPosition());
private void computeTextEdgeLayoutCoordinates(Node node1, TextNode node2, TextEdge edge) {
edge.setPoints(node1.getPosition(), node2.getEdgeConnection());
}

private void computeSingleBranchEdgeCoordinates(Graph graph, BranchEdge edge, SvgParameters svgParameters) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,6 @@ public class SvgParameters {
private double arrowHeight = 10;
private boolean busLegend = true;
private boolean voltageLevelDetails = false;
private double detailedTextNodeYShift = 25;
private String languageTag = "en";
private int voltageValuePrecision = 1;
private int powerValuePrecision = 0;
Expand Down Expand Up @@ -101,7 +100,6 @@ public SvgParameters(SvgParameters other) {
this.arrowHeight = other.arrowHeight;
this.busLegend = other.busLegend;
this.voltageLevelDetails = other.voltageLevelDetails;
this.detailedTextNodeYShift = other.detailedTextNodeYShift;
this.languageTag = other.languageTag;
this.voltageValuePrecision = other.voltageValuePrecision;
this.powerValuePrecision = other.powerValuePrecision;
Expand Down Expand Up @@ -394,15 +392,6 @@ public SvgParameters setVoltageLevelDetails(boolean voltageLevelDetails) {
return this;
}

public double getDetailedTextNodeYShift() {
return detailedTextNodeYShift;
}

public SvgParameters setDetailedTextNodeYShift(double detailedTextNodeYShift) {
this.detailedTextNodeYShift = detailedTextNodeYShift;
return this;
}

public String getLanguageTag() {
return languageTag;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -565,7 +565,7 @@ private void writeTextNode(XMLStreamWriter writer, TextNode textNode, VoltageLev
private void writeDetailedTextNode(XMLStreamWriter writer, TextNode textNode, VoltageLevelNode vlNode, List<String> content) throws XMLStreamException {
writer.writeStartElement(FOREIGN_OBJECT_ELEMENT_NAME);
writeId(writer, textNode);
writer.writeAttribute(Y_ATTRIBUTE, getFormattedValue(textNode.getY() - svgParameters.getDetailedTextNodeYShift()));
writer.writeAttribute(Y_ATTRIBUTE, getFormattedValue(textNode.getY()));
writer.writeAttribute(X_ATTRIBUTE, getFormattedValue(textNode.getX()));

// width and height cannot be set to auto, and object is of width and height 0 if not specified
Expand Down Expand Up @@ -619,15 +619,15 @@ private void writeBusNodeLegend(XMLStreamWriter writer, VoltageLevelNode vlNode)
private void writeSimpleTextNode(XMLStreamWriter writer, TextNode textNode, List<String> content) throws XMLStreamException {
writer.writeStartElement(TEXT_ELEMENT_NAME);
writeId(writer, textNode);
writer.writeAttribute(Y_ATTRIBUTE, getFormattedValue(textNode.getY()));
writer.writeAttribute(Y_ATTRIBUTE, getFormattedValue(textNode.getEdgeConnection().getY()));
if (content.size() == 1) {
writer.writeAttribute(X_ATTRIBUTE, getFormattedValue(textNode.getX()));
writer.writeAttribute(X_ATTRIBUTE, getFormattedValue(textNode.getEdgeConnection().getX()));
writer.writeCharacters(content.get(0));
} else {
for (int i = 0; i < content.size(); i++) {
String line = content.get(i);
writer.writeStartElement(TSPAN_ELEMENT_NAME);
writer.writeAttribute(X_ATTRIBUTE, getFormattedValue(textNode.getX()));
writer.writeAttribute(X_ATTRIBUTE, getFormattedValue(textNode.getEdgeConnection().getX()));
if (i > 0) {
writer.writeAttribute(DY_ATTRIBUTE, "1.1em");
}
Expand Down Expand Up @@ -921,9 +921,9 @@ private void addMetadata(Graph graph, XMLStreamWriter writer) throws XMLStreamEx
textPair.getFirst().getEquipmentId(),
getPrefixedId(textPair.getFirst().getDiagramId()),
getFormattedValue(textPair.getSecond().getX() - textPair.getFirst().getX()),
getFormattedValue(textPair.getSecond().getY() - svgParameters.getDetailedTextNodeYShift() - textPair.getFirst().getY()),
getFormattedValue(textPair.getSecond().getX() - textPair.getFirst().getX()),
getFormattedValue(textPair.getSecond().getY() - textPair.getFirst().getY())));
getFormattedValue(textPair.getSecond().getY() - textPair.getFirst().getY()),
getFormattedValue(textPair.getSecond().getEdgeConnection().getX() - textPair.getFirst().getX()),
getFormattedValue(textPair.getSecond().getEdgeConnection().getY() - textPair.getFirst().getY())));
metadata.addSvgParameters(String.valueOf(svgParameters.isInsertNameDesc()), String.valueOf(svgParameters.isSvgWidthAndHeightAdded()),
svgParameters.getCssLocation().name(), svgParameters.getSizeConstraint().name(),
String.valueOf(svgParameters.getFixedWidth()), String.valueOf(svgParameters.getFixedHeight()),
Expand All @@ -940,11 +940,10 @@ private void addMetadata(Graph graph, XMLStreamWriter writer) throws XMLStreamEx
svgParameters.getSvgPrefix(), String.valueOf(svgParameters.isIdDisplayed()),
String.valueOf(svgParameters.isSubstationDescriptionDisplayed()), getFormattedValue(svgParameters.getArrowHeight()),
String.valueOf(svgParameters.isBusLegend()), String.valueOf(svgParameters.isVoltageLevelDetails()),
getFormattedValue(svgParameters.getDetailedTextNodeYShift()), svgParameters.getLanguageTag(),
String.valueOf(svgParameters.getVoltageValuePrecision()), String.valueOf(svgParameters.getPowerValuePrecision()),
String.valueOf(svgParameters.getAngleValuePrecision()), String.valueOf(svgParameters.getCurrentValuePrecision()),
svgParameters.getEdgeInfoDisplayed().name(), getFormattedValue(svgParameters.getPstArrowHeadSize()),
svgParameters.getUndefinedValueSymbol());
svgParameters.getLanguageTag(), String.valueOf(svgParameters.getVoltageValuePrecision()),
String.valueOf(svgParameters.getPowerValuePrecision()), String.valueOf(svgParameters.getAngleValuePrecision()),
String.valueOf(svgParameters.getCurrentValuePrecision()), svgParameters.getEdgeInfoDisplayed().name(),
getFormattedValue(svgParameters.getPstArrowHeadSize()), svgParameters.getUndefinedValueSymbol());
writer.writeStartElement(METADATA_ELEMENT_NAME);
metadata.writeXml(writer);
writer.writeEndElement();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -126,15 +126,14 @@ public void addSvgParameters(String insertNameDesc, String svgWidthAndHeightAdde
String nodeHollowWidth, String edgesForkLength, String edgesForkAperture, String edgeStartShift, String unknownBusNodeExtraRadius,
String loopDistance, String loopEdgesAperture, String loopControlDistance, String edgeInfoAlongEdge, String edgeNameDisplayed,
String interAnnulusSpace, String svgPrefix, String idDisplayed, String substationDescriptionDisplayed, String arrowHeight,
String busLegend, String voltageLevelDetails, String detailedTextNodeYShift, String languageTag, String voltageValuePrecision,
String powerValuePrecision, String angleValuePrecision, String currentValuePrecision, String edgeInfoDisplayed,
String pstArrowHeadSize, String undefinedValueSymbol) {
String busLegend, String voltageLevelDetails, String languageTag, String voltageValuePrecision, String powerValuePrecision,
String angleValuePrecision, String currentValuePrecision, String edgeInfoDisplayed, String pstArrowHeadSize, String undefinedValueSymbol) {
svgParametersMetadata = new SvgParametersMetadata(insertNameDesc, svgWidthAndHeightAdded, cssLocation, sizeConstraint, fixedWidth, fixedHeight, fixedScale,
arrowShift, arrowLabelShift, converterStationWidth, voltageLevelCircleRadius, fictitiousVoltageLevelCircleRadius,
transformerCircleRadius, nodeHollowWidth, edgesForkLength, edgesForkAperture, edgeStartShift,
unknownBusNodeExtraRadius, loopDistance, loopEdgesAperture, loopControlDistance, edgeInfoAlongEdge,
edgeNameDisplayed, interAnnulusSpace, svgPrefix, idDisplayed, substationDescriptionDisplayed, arrowHeight,
busLegend, voltageLevelDetails, detailedTextNodeYShift, languageTag, voltageValuePrecision, powerValuePrecision,
angleValuePrecision, currentValuePrecision, edgeInfoDisplayed, pstArrowHeadSize, undefinedValueSymbol);
busLegend, voltageLevelDetails, languageTag, voltageValuePrecision, powerValuePrecision, angleValuePrecision,
currentValuePrecision, edgeInfoDisplayed, pstArrowHeadSize, undefinedValueSymbol);
}
}
Loading

0 comments on commit 04c0676

Please sign in to comment.