Skip to content

Commit 7f1b469

Browse files
author
Rob Tjalma
authored
Merge pull request #31 from com-pas/dependabot/maven/com.powsybl-powsybl-single-line-diagram-core-2.7.0
Bump powsybl-single-line-diagram-core from 2.6.0 to 2.7.0
2 parents ab9606f + 4e21c1f commit 7f1b469

File tree

8 files changed

+333
-199
lines changed

8 files changed

+333
-199
lines changed

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ SPDX-License-Identifier: Apache-2.0
2828

2929
<quarkus.platform.version>2.6.2.Final</quarkus.platform.version>
3030
<slf4j.version>1.7.32</slf4j.version>
31-
<powsybl.sld.version>2.6.0</powsybl.sld.version>
31+
<powsybl.sld.version>2.7.0</powsybl.sld.version>
3232
<gson.version>2.8.9</gson.version>
3333
<openpojo.version>0.9.1</openpojo.version>
3434
</properties>
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
// SPDX-FileCopyrightText: 2021 Alliander N.V.
2+
//
3+
// SPDX-License-Identifier: Apache-2.0
4+
package org.lfenergy.compas.scl.auto.alignment.builder;
5+
6+
import com.powsybl.sld.model.BaseGraph;
7+
import com.powsybl.sld.model.Node;
8+
9+
import java.util.Map;
10+
11+
public abstract class AbstractGraphBuilder<G extends BaseGraph> {
12+
private G graph;
13+
private final Map<String, Node> path2Node;
14+
15+
protected AbstractGraphBuilder(Map<String, Node> path2Node) {
16+
this.path2Node = path2Node;
17+
}
18+
19+
public G getGraph() {
20+
return graph;
21+
}
22+
23+
protected void setGraph(G graph) {
24+
this.graph = graph;
25+
}
26+
27+
protected void addNode(String path, Node node) {
28+
path2Node.put(path, node);
29+
}
30+
31+
protected Node getNodeByPath(String path) {
32+
return path2Node.get(path);
33+
}
34+
35+
protected Map<String, Node> getPath2Node() {
36+
return path2Node;
37+
}
38+
}
Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
// SPDX-FileCopyrightText: 2021 Alliander N.V.
2+
//
3+
// SPDX-License-Identifier: Apache-2.0
4+
package org.lfenergy.compas.scl.auto.alignment.builder;
5+
6+
import com.powsybl.sld.model.*;
7+
import org.lfenergy.compas.scl.auto.alignment.exception.SclAutoAlignmentException;
8+
import org.lfenergy.compas.scl.auto.alignment.model.*;
9+
10+
import java.util.HashMap;
11+
import java.util.List;
12+
import java.util.Map;
13+
14+
import static org.lfenergy.compas.scl.auto.alignment.exception.SclAutoAlignmentErrorCode.VOLTAGELEVEL_NOT_FOUND_ERROR_CODE;
15+
16+
public class SubstationGraphBuilder extends AbstractGraphBuilder<SubstationGraph> {
17+
private final GenericSubstation substation;
18+
19+
private final Map<String, VoltageLevelGraphBuilder> voltageLevelGraphBuilderMap = new HashMap<>();
20+
21+
public SubstationGraphBuilder(GenericSubstation substation) {
22+
this(substation, new HashMap<>());
23+
}
24+
25+
public SubstationGraphBuilder(GenericSubstation substation,
26+
Map<String, Node> path2Node) {
27+
super(path2Node);
28+
this.substation = substation;
29+
30+
setGraph(SubstationGraph.create(substation.getFullName()));
31+
32+
createSubstation();
33+
}
34+
35+
private void createSubstation() {
36+
substation.getVoltageLevels().forEach(this::createVoltageLevelGraph);
37+
substation.getPowerTransformers().forEach(this::createPowerTransformer);
38+
}
39+
40+
private void createVoltageLevelGraph(GenericVoltageLevel voltageLevel) {
41+
var voltageLevelBuilder = new VoltageLevelGraphBuilder(voltageLevel, substation, getPath2Node());
42+
getGraph().addVoltageLevel(voltageLevelBuilder.getGraph());
43+
voltageLevelGraphBuilderMap.put(voltageLevel.getFullName(), voltageLevelBuilder);
44+
}
45+
46+
private VoltageLevelGraphBuilder getVoltageLevelBuilder(GenericTransformerWinding transformerWinding) {
47+
var connectivityNode = transformerWinding.getTerminals().get(0).getConnectivityNode();
48+
return substation.getVoltageLevels().stream()
49+
.map(GenericVoltageLevel::getBays)
50+
.flatMap(List::stream)
51+
.map(GenericBay::getConductingEquipments)
52+
.flatMap(List::stream)
53+
.map(GenericConductingEquipment::getTerminals)
54+
.flatMap(List::stream)
55+
.filter(terminal -> connectivityNode.equals(terminal.getConnectivityNode()))
56+
.findFirst()
57+
.map(terminal -> ((GenericConductingEquipment) terminal.getParent()).getParent().getParent())
58+
.map(genericVoltageLevel -> voltageLevelGraphBuilderMap.get(genericVoltageLevel.getFullName()))
59+
.orElseThrow(() -> new SclAutoAlignmentException(VOLTAGELEVEL_NOT_FOUND_ERROR_CODE, "No voltage level found."));
60+
}
61+
62+
private void createPowerTransformer(GenericPowerTransformer powerTransformer) {
63+
if (powerTransformer.isFeeder2WT()) {
64+
var tws = powerTransformer.getTransformerWindings();
65+
getGraph().addMultiTermNode(
66+
Middle2WTNode.create(powerTransformer.getFullName(),
67+
powerTransformer.getFullName(),
68+
getGraph(),
69+
getFeeder2WTLegNode(tws.get(0)),
70+
getFeeder2WTLegNode(tws.get(1)),
71+
getVoltageLevelBuilder(tws.get(0)).getGraph().getVoltageLevelInfos(),
72+
getVoltageLevelBuilder(tws.get(1)).getGraph().getVoltageLevelInfos(),
73+
false));
74+
} else if (powerTransformer.isFeeder3WT()) {
75+
var tws = powerTransformer.getTransformerWindings();
76+
getGraph().addMultiTermNode(
77+
Middle3WTNode.create(powerTransformer.getFullName(),
78+
powerTransformer.getFullName(),
79+
getGraph(),
80+
getFeeder3WTLegNode(tws.get(0)),
81+
getFeeder3WTLegNode(tws.get(1)),
82+
getFeeder3WTLegNode(tws.get(2)),
83+
getVoltageLevelBuilder(tws.get(0)).getGraph().getVoltageLevelInfos(),
84+
getVoltageLevelBuilder(tws.get(1)).getGraph().getVoltageLevelInfos(),
85+
getVoltageLevelBuilder(tws.get(2)).getGraph().getVoltageLevelInfos()));
86+
}
87+
}
88+
89+
private Feeder2WTLegNode getFeeder2WTLegNode(GenericTransformerWinding transformerWinding) {
90+
var connectivityNode = transformerWinding.getTerminals().get(0).getConnectivityNode();
91+
return (Feeder2WTLegNode) getNodeByPath(connectivityNode);
92+
}
93+
94+
private Feeder3WTLegNode getFeeder3WTLegNode(GenericTransformerWinding transformerWinding) {
95+
var connectivityNode = transformerWinding.getTerminals().get(0).getConnectivityNode();
96+
return (Feeder3WTLegNode) getNodeByPath(connectivityNode);
97+
}
98+
}
Lines changed: 173 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,173 @@
1+
// SPDX-FileCopyrightText: 2021 Alliander N.V.
2+
//
3+
// SPDX-License-Identifier: Apache-2.0
4+
package org.lfenergy.compas.scl.auto.alignment.builder;
5+
6+
import com.powsybl.sld.model.*;
7+
import org.lfenergy.compas.scl.auto.alignment.model.*;
8+
9+
import java.util.HashMap;
10+
import java.util.Map;
11+
import java.util.Optional;
12+
import java.util.concurrent.atomic.AtomicInteger;
13+
14+
public class VoltageLevelGraphBuilder extends AbstractGraphBuilder<VoltageLevelGraph> {
15+
private final GenericVoltageLevel voltageLevel;
16+
private final GenericSubstation substation;
17+
18+
public VoltageLevelGraphBuilder(GenericVoltageLevel voltageLevel) {
19+
this(voltageLevel, null, new HashMap<>(), true);
20+
}
21+
22+
public VoltageLevelGraphBuilder(GenericVoltageLevel voltageLevel,
23+
GenericSubstation substation,
24+
Map<String, Node> path2Node) {
25+
this(voltageLevel, substation, path2Node, false);
26+
}
27+
28+
private VoltageLevelGraphBuilder(GenericVoltageLevel voltageLevel,
29+
GenericSubstation substation,
30+
Map<String, Node> path2Node,
31+
boolean forVoltageLevelDiagram) {
32+
super(path2Node);
33+
this.voltageLevel = voltageLevel;
34+
this.substation = substation;
35+
36+
var voltageLevelInfos = new VoltageLevelInfos(voltageLevel.getFullName(),
37+
voltageLevel.getFullName(),
38+
voltageLevel.getVoltage());
39+
setGraph(VoltageLevelGraph.create(voltageLevelInfos, forVoltageLevelDiagram));
40+
41+
createVoltageLevel();
42+
}
43+
44+
private void createVoltageLevel() {
45+
// First process the Busbars.
46+
var busbarIndex = new AtomicInteger(1);
47+
voltageLevel.getBays().stream()
48+
.filter(GenericBay::isBusbar)
49+
.forEach(busbar -> processBusbarNode(busbar, busbarIndex));
50+
51+
// Next process the other bays.
52+
voltageLevel.getBays().stream()
53+
.filter(bay -> !bay.isBusbar())
54+
.forEach(this::processBayNode);
55+
}
56+
57+
private void processBusbarNode(GenericBay busbar,
58+
AtomicInteger busbarIndex) {
59+
busbar.getConnectivityNodes()
60+
.forEach(connectivityNode ->
61+
addNode(connectivityNode.getPathName(),
62+
createBusbarNode(busbar.getFullName(), busbarIndex.getAndIncrement(), 1)));
63+
}
64+
65+
public BusNode createBusbarNode(String id, int busbarIndex, int sectionIndex) {
66+
BusNode busNode = BusNode.create(getGraph(), id, id);
67+
getGraph().addNode(busNode);
68+
busNode.setBusBarIndexSectionIndex(busbarIndex, sectionIndex);
69+
return busNode;
70+
}
71+
72+
private void processBayNode(GenericBay bay) {
73+
bay.getConnectivityNodes().forEach(this::createConnectivityNode);
74+
bay.getConductingEquipments().forEach(this::processConductingEquipment);
75+
}
76+
77+
private void createConnectivityNode(GenericConnectivityNode connectivityNode) {
78+
getPowerTransformer(connectivityNode.getPathName())
79+
.ifPresentOrElse(powerTransformer -> {
80+
if (powerTransformer.isFeeder2WT()) {
81+
addNode(connectivityNode.getPathName(),
82+
createFeeder2WTLegNode(connectivityNode.getPathName(),
83+
powerTransformer.getSide(connectivityNode.getPathName()), 0, null));
84+
} else if (powerTransformer.isFeeder3WT()) {
85+
addNode(connectivityNode.getPathName(),
86+
createFeeder3WTLegNode(connectivityNode.getPathName(),
87+
powerTransformer.getSide(connectivityNode.getPathName()), 0, null));
88+
}
89+
}, () ->
90+
addNode(connectivityNode.getPathName(),
91+
createFictitiousNode(connectivityNode.getPathName()))
92+
);
93+
}
94+
95+
private Optional<GenericPowerTransformer> getPowerTransformer(String pathName) {
96+
if (substation != null) {
97+
return substation.getPowerTransformerByConnectivityNode(pathName);
98+
}
99+
return Optional.empty();
100+
}
101+
102+
private void processConductingEquipment(GenericConductingEquipment conductingEquipment) {
103+
var terminals = conductingEquipment.getTerminals();
104+
var fullName = conductingEquipment.getFullName();
105+
var node = createSwitchNode(fullName);
106+
107+
Node node1 = terminalToNode(terminals.get(0));
108+
Node node2 = null;
109+
var termNb = terminals.size();
110+
if (termNb == 1) {
111+
node2 = createLoad(fullName + "/Grounded");
112+
} else if (termNb == 2) {
113+
node2 = terminalToNode(terminals.get(1));
114+
}
115+
connectNode(node, node1);
116+
connectNode(node, node2);
117+
}
118+
119+
private Node terminalToNode(GenericTerminal terminal) {
120+
var pathName = terminal.getConnectivityNode();
121+
if (pathName != null) {
122+
return getNodeByPath(pathName);
123+
}
124+
return createLoad(terminal.getCNodeName());
125+
}
126+
127+
private SwitchNode createSwitchNode(String id) {
128+
SwitchNode sw = new SwitchNode(id, id, SwitchNode.SwitchKind.BREAKER.name(), false,
129+
getGraph(), SwitchNode.SwitchKind.BREAKER, false);
130+
getGraph().addNode(sw);
131+
return sw;
132+
}
133+
134+
private void connectNode(Node node1, Node node2) {
135+
getGraph().addEdge(node1, node2);
136+
}
137+
138+
private FictitiousNode createFictitiousNode(String id) {
139+
InternalNode fictitiousNode = new InternalNode(id, getGraph());
140+
getGraph().addNode(fictitiousNode);
141+
return fictitiousNode;
142+
}
143+
144+
private FeederNode createLoad(String id) {
145+
FeederInjectionNode fn = FeederInjectionNode.createLoad(getGraph(), id, id);
146+
commonFeederSetting(fn, id, 0, null);
147+
return fn;
148+
}
149+
150+
public Feeder2WTLegNode createFeeder2WTLegNode(String id, FeederWithSideNode.Side side, int order,
151+
BusCell.Direction direction) {
152+
Feeder2WTLegNode f2WTe = Feeder2WTLegNode.create(getGraph(), id + "_" + side, id, id, side);
153+
commonFeederSetting(f2WTe, id, order, direction);
154+
return f2WTe;
155+
}
156+
157+
public Feeder3WTLegNode createFeeder3WTLegNode(String id, FeederWithSideNode.Side side, int order,
158+
BusCell.Direction direction) {
159+
Feeder3WTLegNode f3WTe = Feeder3WTLegNode.createForSubstationDiagram(getGraph(), id + "_" + side, id, id, side);
160+
commonFeederSetting(f3WTe, id + side.getIntValue(), order, direction);
161+
return f3WTe;
162+
}
163+
164+
private void commonFeederSetting(FeederNode node, String id, int order, BusCell.Direction direction) {
165+
node.setLabel(id);
166+
getGraph().addNode(node);
167+
168+
if (direction != null) {
169+
node.setOrder(order);
170+
node.setDirection(direction);
171+
}
172+
}
173+
}

service/src/main/java/org/lfenergy/compas/scl/auto/alignment/service/SclAutoAlignmentDiagramLabelProvider.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,10 @@
1515
import java.util.*;
1616

1717
public class SclAutoAlignmentDiagramLabelProvider implements DiagramLabelProvider {
18-
private final Map<Node, List<NodeLabel>> busLabels;
18+
private final Map<Node, List<NodeLabel>> busLabels = new HashMap<>();
1919

2020
public SclAutoAlignmentDiagramLabelProvider(SubstationGraph graph) {
21-
this.busLabels = new HashMap<>();
22-
graph.getNodes().forEach(voltageLevelGraph ->
21+
graph.getVoltageLevels().forEach(voltageLevelGraph ->
2322
voltageLevelGraph.getNodes().forEach(this::addNode)
2423
);
2524
graph.getMultiTermNodes().forEach(this::addNode);

0 commit comments

Comments
 (0)