Skip to content

Commit 0c330d9

Browse files
Merge branch 'main' into send-all-limit-sets-to-branch-forms
2 parents b40535f + 0742433 commit 0c330d9

File tree

11 files changed

+573
-44
lines changed

11 files changed

+573
-44
lines changed

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919

2020
<groupId>org.gridsuite</groupId>
2121
<artifactId>gridsuite-network-map-server</artifactId>
22-
<version>2.22.0-SNAPSHOT</version>
22+
<version>2.23.0-SNAPSHOT</version>
2323

2424
<packaging>jar</packaging>
2525
<name>Network map server</name>

src/main/java/org/gridsuite/network/map/dto/common/CurrentLimitsData.java

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
import lombok.Builder;
1111
import lombok.EqualsAndHashCode;
1212
import lombok.Getter;
13-
import org.springframework.util.CollectionUtils;
13+
import lombok.ToString;
1414

1515
import java.util.List;
1616
import java.util.Objects;
@@ -22,6 +22,7 @@
2222
@Builder
2323
@Getter
2424
@EqualsAndHashCode
25+
@ToString
2526
public class CurrentLimitsData {
2627
// may be null in case we just need the selected limit set and don't really need its name/id
2728
@JsonInclude(JsonInclude.Include.NON_NULL)
@@ -42,10 +43,6 @@ public enum Applicability {
4243
SIDE2,
4344
}
4445

45-
public boolean hasLimits() {
46-
return permanentLimit != null && !Double.isNaN(permanentLimit) || !CollectionUtils.isEmpty(temporaryLimits);
47-
}
48-
4946
public boolean limitsEquals(CurrentLimitsData other) {
5047
return Objects.equals(permanentLimit, other.permanentLimit)
5148
&& Objects.equals(temporaryLimits, other.temporaryLimits);

src/main/java/org/gridsuite/network/map/dto/common/TemporaryLimitData.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,15 @@
1010
import lombok.Builder;
1111
import lombok.EqualsAndHashCode;
1212
import lombok.Getter;
13+
import lombok.ToString;
1314

1415
/**
1516
* @author David Braquart <david.braquart at rte-france.com>
1617
*/
1718
@Builder
1819
@Getter
1920
@EqualsAndHashCode
21+
@ToString
2022
public class TemporaryLimitData {
2123
private String name;
2224

src/main/java/org/gridsuite/network/map/dto/definition/voltagelevel/VoltageLevelFormInfos.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import org.gridsuite.network.map.dto.definition.extension.IdentifiableShortCircuitInfos;
1616

1717
import java.util.List;
18+
import java.util.Map;
1819
import java.util.Optional;
1920

2021
/**
@@ -53,4 +54,7 @@ public class VoltageLevelFormInfos extends ElementInfosWithProperties {
5354
@JsonInclude(JsonInclude.Include.NON_NULL)
5455
private Boolean isRetrievedBusbarSections;
5556

57+
@JsonInclude(JsonInclude.Include.NON_NULL)
58+
Map<String, List<String>> busBarSectionInfos;
59+
5660
}

src/main/java/org/gridsuite/network/map/dto/mapper/VoltageLevelInfosMapper.java

Lines changed: 27 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,15 +12,14 @@
1212
import lombok.Setter;
1313
import org.gridsuite.network.map.dto.ElementInfos;
1414
import org.gridsuite.network.map.dto.InfoTypeParameters;
15+
import org.gridsuite.network.map.dto.definition.busbarsection.BusBarSectionFormInfos;
1516
import org.gridsuite.network.map.dto.definition.voltagelevel.VoltageLevelFormInfos;
1617
import org.gridsuite.network.map.dto.definition.voltagelevel.VoltageLevelMapInfos;
1718
import org.gridsuite.network.map.dto.definition.voltagelevel.VoltageLevelTabInfos;
1819
import org.gridsuite.network.map.dto.utils.ElementUtils;
1920

20-
import java.util.Collections;
21-
import java.util.HashMap;
22-
import java.util.List;
23-
import java.util.Map;
21+
import java.util.*;
22+
import java.util.stream.Collectors;
2423

2524
import static org.gridsuite.network.map.dto.utils.ElementUtils.*;
2625

@@ -49,6 +48,7 @@ public static ElementInfos toData(Identifiable<?> identifiable, InfoTypeParamete
4948
public static VoltageLevelTopologyInfos getTopologyInfos(VoltageLevel voltageLevel) {
5049
VoltageLevelTopologyInfos topologyInfos = new VoltageLevelTopologyInfos();
5150
Map<Integer, Integer> nbSectionsPerBusbar = new HashMap<>();
51+
List<BusBarSectionFormInfos> busbarSectionInfos = new ArrayList<>();
5252
for (BusbarSection bbs : voltageLevel.getNodeBreakerView().getBusbarSections()) {
5353
var extension = bbs.getExtension(BusbarSectionPosition.class);
5454
if (extension != null) {
@@ -62,6 +62,12 @@ public static VoltageLevelTopologyInfos getTopologyInfos(VoltageLevel voltageLev
6262
if (extension.getSectionIndex() > nbSectionsPerBusbar.get(extension.getBusbarIndex())) {
6363
nbSectionsPerBusbar.put(extension.getBusbarIndex(), extension.getSectionIndex());
6464
}
65+
BusBarSectionFormInfos busbarSectionInfo = BusBarSectionFormInfos.builder()
66+
.id(bbs.getId())
67+
.vertPos(extension.getSectionIndex())
68+
.horizPos(extension.getBusbarIndex())
69+
.build();
70+
busbarSectionInfos.add(busbarSectionInfo);
6571
} else {
6672
return new VoltageLevelTopologyInfos();
6773
}
@@ -72,6 +78,7 @@ public static VoltageLevelTopologyInfos getTopologyInfos(VoltageLevel voltageLev
7278

7379
topologyInfos.setRetrievedBusbarSections(true);
7480
topologyInfos.setSwitchKinds(Collections.nCopies(topologyInfos.getSectionCount() - 1, SwitchKind.DISCONNECTOR));
81+
topologyInfos.setBusbarSections(busbarSectionInfos);
7582

7683
return topologyInfos;
7784
}
@@ -94,6 +101,7 @@ protected static VoltageLevelFormInfos toFormInfos(Identifiable<?> identifiable)
94101
builder.sectionCount(vlTopologyInfos.getSectionCount());
95102
builder.switchKinds(vlTopologyInfos.getSwitchKinds());
96103
builder.isRetrievedBusbarSections(vlTopologyInfos.isRetrievedBusbarSections());
104+
builder.busBarSectionInfos(vlTopologyInfos.getBusBarSectionInfosGrouped());
97105
}
98106

99107
builder.identifiableShortCircuit(toIdentifiableShortCircuit(voltageLevel));
@@ -132,9 +140,24 @@ protected static VoltageLevelTabInfos toTabInfos(Identifiable<?> identifiable) {
132140
@Getter
133141
@Setter
134142
public static class VoltageLevelTopologyInfos {
143+
List<BusBarSectionFormInfos> busbarSections = List.of();
135144
boolean isRetrievedBusbarSections = false;
136145
int busbarCount = 1;
137146
int sectionCount = 1;
138147
List<SwitchKind> switchKinds = List.of();
148+
149+
public Map<String, List<String>> getBusBarSectionInfosGrouped() {
150+
return busbarSections.stream()
151+
.collect(Collectors.groupingBy(
152+
section -> String.valueOf(section.getHorizPos()),
153+
Collectors.collectingAndThen(
154+
Collectors.toList(),
155+
list -> list.stream()
156+
.sorted(Comparator.comparing(BusBarSectionFormInfos::getVertPos))
157+
.map(BusBarSectionFormInfos::getId)
158+
.toList()
159+
)
160+
));
161+
}
139162
}
140163
}

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

Lines changed: 21 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -11,16 +11,13 @@
1111
import com.powsybl.iidm.network.extensions.*;
1212
import com.powsybl.math.graph.TraversalType;
1313
import org.gridsuite.network.map.dto.common.*;
14+
import org.gridsuite.network.map.dto.common.CurrentLimitsData.Applicability;
1415
import org.gridsuite.network.map.dto.definition.extension.*;
1516
import org.gridsuite.network.map.dto.definition.threewindingstransformer.ThreeWindingsTransformerTabInfos;
17+
import org.springframework.lang.Nullable;
1618
import org.springframework.util.CollectionUtils;
1719

18-
import java.util.ArrayList;
19-
import java.util.Collection;
20-
import java.util.HashMap;
21-
import java.util.List;
22-
import java.util.Map;
23-
import java.util.Optional;
20+
import java.util.*;
2421
import java.util.function.Consumer;
2522
import java.util.function.Function;
2623
import java.util.stream.Collectors;
@@ -93,7 +90,7 @@ public static void buildCurrentLimits(Collection<OperationalLimitsGroup> current
9390
}
9491
}
9592

96-
private static CurrentLimitsData copyCurrentLimitsData(CurrentLimitsData currentLimitsData, CurrentLimitsData.Applicability applicability) {
93+
private static CurrentLimitsData copyCurrentLimitsData(CurrentLimitsData currentLimitsData, Applicability applicability) {
9794
return CurrentLimitsData.builder()
9895
.id(currentLimitsData.getId())
9996
.applicability(applicability)
@@ -111,15 +108,17 @@ public static void mergeCurrentLimits(Collection<OperationalLimitsGroup> operati
111108

112109
// Build temporary limit from side 1 and 2
113110
List<CurrentLimitsData> currentLimitsData1 = operationalLimitsGroups1.stream()
114-
.map(currentLimitsData ->
115-
ElementUtils.operationalLimitsGroupToMapDataCurrentLimits(currentLimitsData, SIDE1)).toList();
111+
.map(currentLimitsData -> ElementUtils.operationalLimitsGroupToMapDataCurrentLimits(currentLimitsData, SIDE1))
112+
.filter(Objects::nonNull)
113+
.toList();
116114
ArrayList<CurrentLimitsData> currentLimitsData2 = new ArrayList<>(operationalLimitsGroups2.stream()
117-
.map(currentLimitsData ->
118-
ElementUtils.operationalLimitsGroupToMapDataCurrentLimits(currentLimitsData, SIDE2)).toList());
115+
.map(currentLimitsData -> ElementUtils.operationalLimitsGroupToMapDataCurrentLimits(currentLimitsData, SIDE2))
116+
.filter(Objects::nonNull)
117+
.toList());
119118

120119
// combine 2 sides in one list
121120

122-
// simple case : one of the arrays are empty
121+
// simple case: one of the arrays are empty
123122
if (currentLimitsData2.isEmpty() && !currentLimitsData1.isEmpty()) {
124123
mergedLimitsData.addAll(currentLimitsData1);
125124
build.accept(mergedLimitsData);
@@ -134,30 +133,22 @@ public static void mergeCurrentLimits(Collection<OperationalLimitsGroup> operati
134133
// more complex case
135134
for (CurrentLimitsData limitsData : currentLimitsData1) {
136135
Optional<CurrentLimitsData> l2 = currentLimitsData2.stream().filter(l -> l.getId().equals(limitsData.getId())).findFirst();
137-
138136
if (l2.isPresent()) {
139137
CurrentLimitsData limitsData2 = l2.get();
140-
// Only side one has limits
141-
if (limitsData.hasLimits() && !limitsData2.hasLimits()) {
138+
// both sides have limits and limits are equals
139+
if (limitsData.limitsEquals(limitsData2)) {
140+
mergedLimitsData.add(copyCurrentLimitsData(limitsData, EQUIPMENT));
141+
// both sides have limits and are different: create 2 different limit sets
142+
} else {
143+
// Side 1
142144
mergedLimitsData.add(limitsData);
143-
// only side two has limits
144-
} else if (limitsData2.hasLimits() && !limitsData.hasLimits()) {
145+
// Side 2
145146
mergedLimitsData.add(limitsData2);
146-
} else {
147-
// both sides have limits and limits are equals
148-
if (limitsData.limitsEquals(limitsData2)) {
149-
mergedLimitsData.add(copyCurrentLimitsData(limitsData, EQUIPMENT));
150-
// both side have limits and they are different : create 2 different limit sets
151-
} else {
152-
// Side 1
153-
mergedLimitsData.add(limitsData);
154-
// Side 2
155-
mergedLimitsData.add(limitsData2);
156-
}
157147
}
158148
// remove processed limits from side 2
159149
currentLimitsData2.remove(l2.get());
160150
} else {
151+
// only one side has limits
161152
mergedLimitsData.add(limitsData);
162153
}
163154
}
@@ -261,7 +252,8 @@ public static CurrentLimitsData operationalLimitsGroupToMapDataCurrentLimits(Ope
261252
return operationalLimitsGroupToMapDataCurrentLimits(operationalLimitsGroup, null);
262253
}
263254

264-
public static CurrentLimitsData operationalLimitsGroupToMapDataCurrentLimits(OperationalLimitsGroup operationalLimitsGroup, CurrentLimitsData.Applicability applicability) {
255+
@Nullable
256+
public static CurrentLimitsData operationalLimitsGroupToMapDataCurrentLimits(OperationalLimitsGroup operationalLimitsGroup, Applicability applicability) {
265257
if (operationalLimitsGroup == null || operationalLimitsGroup.getCurrentLimits().isEmpty()) {
266258
return null;
267259
}

0 commit comments

Comments
 (0)