Skip to content
This repository has been archived by the owner on Nov 18, 2022. It is now read-only.

Commit

Permalink
Remove visitor usage (#86)
Browse files Browse the repository at this point in the history
* Remove VisitorBuilder usage
* Update reference svg files

Signed-off-by: Thomas ADAM <tadam@silicom.fr>
  • Loading branch information
tadam50 authored Jul 29, 2022
1 parent 63382d9 commit 8a56054
Show file tree
Hide file tree
Showing 9 changed files with 1,387 additions and 1,380 deletions.
189 changes: 98 additions & 91 deletions src/main/java/com/powsybl/nad/build/iidm/NetworkGraphBuilder.java
Original file line number Diff line number Diff line change
Expand Up @@ -49,13 +49,15 @@ public Graph buildGraph() {
}

private void addGraphNodes(Graph graph) {
network.getVoltageLevelStream().filter(voltageLevelFilter).forEach(vl -> createVoltageLevelNode(vl, graph, true));
network.getVoltageLevelStream()
.filter(voltageLevelFilter)
.forEach(vl -> createVoltageLevelNode(vl, graph, true));
}

private void addGraphEdges(Graph graph) {
network.getVoltageLevelStream()
.filter(voltageLevelFilter)
.forEach(vl -> vl.visitEquipments(new VisitorBuilder(graph)));
.forEach(vl -> visitEquipments(vl, graph));
}

private VoltageLevelNode createVoltageLevelNode(VoltageLevel vl, Graph graph, boolean visible) {
Expand All @@ -70,119 +72,124 @@ private VoltageLevelNode createVoltageLevelNode(VoltageLevel vl, Graph graph, bo
return vlNode;
}

private class VisitorBuilder extends DefaultTopologyVisitor {
private final Graph graph;
private void visitEquipments(VoltageLevel vl, Graph graph) {
vl.getLineStream().forEach(l -> visitLine(vl, l, graph));
vl.getTwoWindingsTransformerStream().forEach(twt -> visitTwoWindingsTransformer(vl, twt, graph));
vl.getThreeWindingsTransformerStream().forEach(thwt -> visitThreeWindingsTransformer(vl, thwt, graph));
vl.getConnectableStream(HvdcConverterStation.class).forEach(hvdc -> visitHvdcConverterStation(hvdc, graph));
}

public VisitorBuilder(Graph graph) {
this.graph = graph;
}
private void visitLine(VoltageLevel vl, Line line, Graph graph) {
addEdge(graph, line, vl, BranchEdge.LINE_EDGE);
}

@Override
public void visitLine(Line line, Branch.Side side) {
addEdge(line, side, BranchEdge.LINE_EDGE);
}
private void visitTwoWindingsTransformer(VoltageLevel vl, TwoWindingsTransformer twt, Graph graph) {
addEdge(graph, twt, vl, BranchEdge.TWO_WT_EDGE);
}

@Override
public void visitTwoWindingsTransformer(TwoWindingsTransformer twt, Branch.Side side) {
addEdge(twt, side, BranchEdge.TWO_WT_EDGE);
private void visitThreeWindingsTransformer(VoltageLevel vl, ThreeWindingsTransformer thwt, Graph graph) {
// check if the transformer was not already added (at the other sides of the transformer)
if (graph.containsNode(thwt.getId())) {
return;
}

@Override
public void visitThreeWindingsTransformer(ThreeWindingsTransformer twt, ThreeWindingsTransformer.Side side) {
// check if the transformer was not already added (at the other sides of the transformer)
if (graph.containsNode(twt.getId())) {
return;
}
ThreeWtNode tn = new ThreeWtNode(idProvider.createId(thwt), thwt.getId(), thwt.getNameOrId());
graph.addNode(tn);

ThreeWtNode tn = new ThreeWtNode(idProvider.createId(twt), twt.getId(), twt.getNameOrId());
graph.addNode(tn);
ThreeWindingsTransformer.Side side;
if (thwt.getLeg1().getTerminal().getVoltageLevel() == vl) {
side = ThreeWindingsTransformer.Side.ONE;
} else if (thwt.getLeg2().getTerminal().getVoltageLevel() == vl) {
side = ThreeWindingsTransformer.Side.TWO;
} else {
side = ThreeWindingsTransformer.Side.THREE;
}

for (ThreeWindingsTransformer.Side s : getSidesArray(side)) {
addThreeWtEdge(twt, tn, s);
}
for (ThreeWindingsTransformer.Side s : getSidesArray(side)) {
addThreeWtEdge(graph, thwt, tn, s);
}
}

@Override
public void visitHvdcConverterStation(HvdcConverterStation<?> converterStation) {
// check if the hvdc line was not already added (at the other side of the line)
HvdcLine hvdcLine = converterStation.getHvdcLine();
if (graph.containsEdge(hvdcLine.getId())) {
return;
}
private void visitHvdcConverterStation(HvdcConverterStation<?> converterStation, Graph graph) {
// check if the hvdc line was not already added (at the other side of the line)
HvdcLine hvdcLine = converterStation.getHvdcLine();
if (graph.containsEdge(hvdcLine.getId())) {
return;
}

HvdcLine.Side otherSide = (hvdcLine.getConverterStation1().getId().equals(converterStation.getId()))
? HvdcLine.Side.TWO : HvdcLine.Side.ONE;
HvdcLine.Side otherSide = (hvdcLine.getConverterStation1().getId().equals(converterStation.getId()))
? HvdcLine.Side.TWO : HvdcLine.Side.ONE;

Terminal terminal = converterStation.getTerminal();
Terminal otherSideTerminal = hvdcLine.getConverterStation(otherSide).getTerminal();
Terminal terminal = converterStation.getTerminal();
Terminal otherSideTerminal = hvdcLine.getConverterStation(otherSide).getTerminal();

addEdge(terminal, otherSideTerminal, hvdcLine, BranchEdge.HVDC_LINE_EDGE, otherSide == HvdcLine.Side.ONE);
}
addEdge(graph, terminal, otherSideTerminal, hvdcLine, BranchEdge.HVDC_LINE_EDGE, otherSide == HvdcLine.Side.ONE);
}

private void addEdge(Branch<?> branch, Branch.Side side, String edgeType) {
// check if the edge was not already added (at the other side of the transformer)
if (graph.containsEdge(branch.getId())) {
return;
}
private void addEdge(Graph graph, Branch<?> branch, VoltageLevel vl, String edgeType) {
Branch.Side side = branch.getTerminal(Branch.Side.ONE).getVoltageLevel() == vl ? Branch.Side.ONE : Branch.Side.TWO;
// check if the edge was not already added (at the other side of the transformer)
if (graph.containsEdge(branch.getId())) {
return;
}

Terminal terminalA = branch.getTerminal(side);
Terminal terminalB = branch.getTerminal(IidmUtils.getOpposite(side));
Terminal terminalA = branch.getTerminal(side);
Terminal terminalB = branch.getTerminal(IidmUtils.getOpposite(side));

addEdge(terminalA, terminalB, branch, edgeType, side == Branch.Side.TWO);
}
addEdge(graph, terminalA, terminalB, branch, edgeType, side == Branch.Side.TWO);
}

private void addEdge(Terminal terminalA, Terminal terminalB, Identifiable<?> identifiable, String edgeType, boolean terminalsInReversedOrder) {
VoltageLevelNode vlNodeA = graph.getVoltageLevelNode(terminalA.getVoltageLevel().getId())
.orElseThrow(() -> new PowsyblException("Cannot add edge, corresponding voltage level is unknown: '" + terminalA.getVoltageLevel().getId() + "'"));
VoltageLevelNode vlNodeB = getOrCreateInvisibleVoltageLevelNode(terminalB);
private void addEdge(Graph graph, Terminal terminalA, Terminal terminalB, Identifiable<?> identifiable, String edgeType, boolean terminalsInReversedOrder) {
VoltageLevelNode vlNodeA = graph.getVoltageLevelNode(terminalA.getVoltageLevel().getId())
.orElseThrow(() -> new PowsyblException("Cannot add edge, corresponding voltage level is unknown: '" + terminalA.getVoltageLevel().getId() + "'"));
VoltageLevelNode vlNodeB = getOrCreateInvisibleVoltageLevelNode(graph, terminalB);

BusNode busNodeA = getBusNode(terminalA);
BusNode busNodeB = getBusNode(terminalB);
BusNode busNodeA = getBusNode(graph, terminalA);
BusNode busNodeB = getBusNode(graph, terminalB);

BranchEdge edge = new BranchEdge(idProvider.createId(identifiable), identifiable.getId(), identifiable.getNameOrId(), edgeType);
if (!terminalsInReversedOrder) {
graph.addEdge(vlNodeA, busNodeA, vlNodeB, busNodeB, edge);
} else {
graph.addEdge(vlNodeB, busNodeB, vlNodeA, busNodeA, edge);
}
BranchEdge edge = new BranchEdge(idProvider.createId(identifiable), identifiable.getId(), identifiable.getNameOrId(), edgeType);
if (!terminalsInReversedOrder) {
graph.addEdge(vlNodeA, busNodeA, vlNodeB, busNodeB, edge);
} else {
graph.addEdge(vlNodeB, busNodeB, vlNodeA, busNodeA, edge);
}
}

private void addThreeWtEdge(ThreeWindingsTransformer twt, ThreeWtNode tn, ThreeWindingsTransformer.Side side) {
Terminal terminal = twt.getTerminal(side);
VoltageLevelNode vlNode = getOrCreateInvisibleVoltageLevelNode(terminal);
ThreeWtEdge edge = new ThreeWtEdge(idProvider.createId(IidmUtils.get3wtLeg(twt, side)),
twt.getId(), twt.getNameOrId(), IidmUtils.getThreeWtEdgeSideFromIidmSide(side), vlNode.isVisible());
graph.addEdge(vlNode, getBusNode(terminal), tn, edge);
}
private void addThreeWtEdge(Graph graph, ThreeWindingsTransformer twt, ThreeWtNode tn, ThreeWindingsTransformer.Side side) {
Terminal terminal = twt.getTerminal(side);
VoltageLevelNode vlNode = getOrCreateInvisibleVoltageLevelNode(graph, terminal);
ThreeWtEdge edge = new ThreeWtEdge(idProvider.createId(IidmUtils.get3wtLeg(twt, side)),
twt.getId(), twt.getNameOrId(), IidmUtils.getThreeWtEdgeSideFromIidmSide(side), vlNode.isVisible());
graph.addEdge(vlNode, getBusNode(graph, terminal), tn, edge);
}

private ThreeWindingsTransformer.Side[] getSidesArray(ThreeWindingsTransformer.Side sideA) {
ThreeWindingsTransformer.Side sideB;
ThreeWindingsTransformer.Side sideC;
if (sideA == ThreeWindingsTransformer.Side.ONE) {
sideB = ThreeWindingsTransformer.Side.TWO;
sideC = ThreeWindingsTransformer.Side.THREE;
} else if (sideA == ThreeWindingsTransformer.Side.TWO) {
sideB = ThreeWindingsTransformer.Side.ONE;
sideC = ThreeWindingsTransformer.Side.THREE;
} else {
sideB = ThreeWindingsTransformer.Side.ONE;
sideC = ThreeWindingsTransformer.Side.TWO;
}
return new ThreeWindingsTransformer.Side[] {sideA, sideB, sideC};
private BusNode getBusNode(Graph graph, Terminal terminal) {
Bus connectableBusA = terminal.getBusView().getConnectableBus();
if (connectableBusA == null) {
graph.getVoltageLevelNode(terminal.getVoltageLevel().getId()).ifPresent(vlNode -> vlNode.setHasUnknownBusNode(true));
return BusNode.UNKNOWN;
}
return graph.getBusNode(connectableBusA.getId());
}

private BusNode getBusNode(Terminal terminal) {
Bus connectableBusA = terminal.getBusView().getConnectableBus();
if (connectableBusA == null) {
graph.getVoltageLevelNode(terminal.getVoltageLevel().getId()).ifPresent(vlNode -> vlNode.setHasUnknownBusNode(true));
return BusNode.UNKNOWN;
}
return graph.getBusNode(connectableBusA.getId());
}
private VoltageLevelNode getOrCreateInvisibleVoltageLevelNode(Graph graph, Terminal terminal) {
VoltageLevel vl = terminal.getVoltageLevel();
return graph.getVoltageLevelNode(vl.getId()).orElseGet(() -> createVoltageLevelNode(vl, graph, false));
}

private VoltageLevelNode getOrCreateInvisibleVoltageLevelNode(Terminal terminal) {
VoltageLevel vl = terminal.getVoltageLevel();
return graph.getVoltageLevelNode(vl.getId()).orElseGet(() -> createVoltageLevelNode(vl, graph, false));
private ThreeWindingsTransformer.Side[] getSidesArray(ThreeWindingsTransformer.Side sideA) {
ThreeWindingsTransformer.Side sideB;
ThreeWindingsTransformer.Side sideC;
if (sideA == ThreeWindingsTransformer.Side.ONE) {
sideB = ThreeWindingsTransformer.Side.TWO;
sideC = ThreeWindingsTransformer.Side.THREE;
} else if (sideA == ThreeWindingsTransformer.Side.TWO) {
sideB = ThreeWindingsTransformer.Side.ONE;
sideC = ThreeWindingsTransformer.Side.THREE;
} else {
sideB = ThreeWindingsTransformer.Side.ONE;
sideC = ThreeWindingsTransformer.Side.TWO;
}
return new ThreeWindingsTransformer.Side[] {sideA, sideB, sideC};
}
}
Loading

0 comments on commit 8a56054

Please sign in to comment.