Skip to content

Commit c112b6a

Browse files
committed
enhance BusbarSectionFinderTraverser to handle all cases
1 parent 96171f4 commit c112b6a

File tree

2 files changed

+59
-16
lines changed

2 files changed

+59
-16
lines changed

src/main/java/org/gridsuite/network/map/dto/definition/extension/BusbarSectionFinderTraverser.java

Lines changed: 55 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -8,40 +8,82 @@
88

99
import com.powsybl.iidm.network.IdentifiableType;
1010
import com.powsybl.iidm.network.Switch;
11+
import com.powsybl.iidm.network.SwitchKind;
1112
import com.powsybl.iidm.network.Terminal;
1213
import com.powsybl.math.graph.TraverseResult;
14+
import lombok.Getter;
15+
16+
import java.util.ArrayList;
17+
import java.util.HashSet;
18+
import java.util.List;
19+
import java.util.Set;
1320

1421
/**
1522
* @author Slimane Amar <slimane.amar at rte-france.com>
1623
*/
1724
public class BusbarSectionFinderTraverser implements Terminal.TopologyTraverser {
1825

19-
private final boolean onlyConnectedBbs;
20-
21-
private String firstTraversedBbsId;
22-
23-
public BusbarSectionFinderTraverser(boolean onlyConnectedBbs) {
24-
this.onlyConnectedBbs = onlyConnectedBbs;
25-
}
26+
private final List<BusbarCandidate> busbarCandidates = new ArrayList<>();
27+
private final Set<String> visitedTerminals = new HashSet<>();
28+
private static final int MAX_VISITED = 50;
2629

2730
@Override
2831
public TraverseResult traverse(Terminal terminal, boolean connected) {
29-
if (terminal.getConnectable().getType() == IdentifiableType.BUSBAR_SECTION) {
30-
firstTraversedBbsId = terminal.getConnectable().getId();
32+
String terminalId = terminal.getConnectable().getId();
33+
if (visitedTerminals.contains(terminalId)) {
34+
return TraverseResult.TERMINATE_PATH;
35+
}
36+
visitedTerminals.add(terminalId);
37+
if (visitedTerminals.size() > MAX_VISITED) {
3138
return TraverseResult.TERMINATE_TRAVERSER;
3239
}
40+
41+
// If a busbar section is found, add it as a candidate
42+
if (terminal.getConnectable().getType() == IdentifiableType.BUSBAR_SECTION) {
43+
busbarCandidates.add(new BusbarCandidate(terminalId, connected));
44+
// CONTINUE to explore other paths to other busbars
45+
return TraverseResult.CONTINUE;
46+
}
3347
return TraverseResult.CONTINUE;
3448
}
3549

3650
@Override
3751
public TraverseResult traverse(Switch aSwitch) {
38-
if (onlyConnectedBbs && aSwitch.isOpen()) {
39-
return TraverseResult.TERMINATE_PATH;
52+
if (visitedTerminals.size() > MAX_VISITED) {
53+
return TraverseResult.TERMINATE_TRAVERSER;
54+
}
55+
56+
// KEY: Open disconnectors end this path but not the overall traversal
57+
// They block access to this busbar but not to the others
58+
if (aSwitch.isOpen() && aSwitch.getKind() == SwitchKind.DISCONNECTOR) {
59+
return TraverseResult.TERMINATE_PATH; // Ends this path, not the whole traversal
4060
}
4161
return TraverseResult.CONTINUE;
4262
}
4363

44-
public String getFirstTraversedBbsId() {
45-
return firstTraversedBbsId;
64+
public String getBusbarWithClosedDisconnector() {
65+
// Search for a connected busbar (disconnector closed)
66+
for (BusbarCandidate candidate : busbarCandidates) {
67+
if (candidate.isConnected()) {
68+
return candidate.getId();
69+
}
70+
}
71+
72+
// If none is connected, return the first one found (fallback)
73+
if (!busbarCandidates.isEmpty()) {
74+
return busbarCandidates.getFirst().getId();
75+
}
76+
return null;
77+
}
78+
79+
@Getter
80+
private static class BusbarCandidate {
81+
private final String id;
82+
private final boolean connected;
83+
84+
public BusbarCandidate(String id, boolean connected) {
85+
this.id = id;
86+
this.connected = connected;
87+
}
4688
}
4789
}

src/main/java/org/gridsuite/network/map/dto/utils/ElementUtils.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -47,9 +47,10 @@ public static String getBusOrBusbarSection(Terminal terminal) {
4747
return terminal.getBusBreakerView().getConnectableBus().getId();
4848
}
4949
} else {
50-
final BusbarSectionFinderTraverser connectedBusbarSectionFinder = new BusbarSectionFinderTraverser(terminal.isConnected());
51-
terminal.traverse(connectedBusbarSectionFinder, TraversalType.BREADTH_FIRST);
52-
return connectedBusbarSectionFinder.getFirstTraversedBbsId();
50+
// NODE_BREAKER: explore all paths and choose the busbar with the closed disconnector
51+
BusbarSectionFinderTraverser finder = new BusbarSectionFinderTraverser();
52+
terminal.traverse(finder, TraversalType.BREADTH_FIRST);
53+
return finder.getBusbarWithClosedDisconnector();
5354
}
5455
}
5556

0 commit comments

Comments
 (0)