Skip to content

Commit b32f39d

Browse files
authored
Add attribute currentLimits to LineFormInfos and twoWindingsTransformerFormInfos dto (#264)
Signed-off-by: basseche <[email protected]>
1 parent fb0916e commit b32f39d

20 files changed

+718
-45
lines changed

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

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,10 @@
1010
import lombok.Builder;
1111
import lombok.EqualsAndHashCode;
1212
import lombok.Getter;
13+
import org.springframework.util.CollectionUtils;
1314

1415
import java.util.List;
16+
import java.util.Objects;
1517

1618
/**
1719
* @author David Braquart <david.braquart at rte-france.com>
@@ -30,5 +32,23 @@ public class CurrentLimitsData {
3032

3133
@JsonInclude(JsonInclude.Include.NON_NULL)
3234
private List<TemporaryLimitData> temporaryLimits;
35+
36+
@JsonInclude
37+
private Applicability applicability;
38+
39+
public enum Applicability {
40+
EQUIPMENT, // applied to both sides
41+
SIDE1,
42+
SIDE2,
43+
}
44+
45+
public boolean hasLimits() {
46+
return !Double.isNaN(permanentLimit) || !CollectionUtils.isEmpty(temporaryLimits);
47+
}
48+
49+
public boolean limitsEquals(CurrentLimitsData other) {
50+
return Objects.equals(permanentLimit, other.permanentLimit)
51+
&& Objects.equals(temporaryLimits, other.temporaryLimits);
52+
}
3353
}
3454

src/main/java/org/gridsuite/network/map/dto/definition/line/LineFormInfos.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,9 +55,14 @@ public class LineFormInfos extends ElementInfosWithProperties {
5555
@JsonInclude(JsonInclude.Include.NON_NULL)
5656
private Double i2;
5757

58+
@JsonInclude(JsonInclude.Include.NON_EMPTY)
59+
private List<CurrentLimitsData> currentLimits;
60+
61+
//TODO : remove when modification is done
5862
@JsonInclude(JsonInclude.Include.NON_EMPTY)
5963
private List<CurrentLimitsData> currentLimits1;
6064

65+
//TODO : remove when modification is done
6166
@JsonInclude(JsonInclude.Include.NON_EMPTY)
6267
private List<CurrentLimitsData> currentLimits2;
6368

src/main/java/org/gridsuite/network/map/dto/definition/twowindingstransformer/TwoWindingsTransformerFormInfos.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,12 +57,16 @@ public class TwoWindingsTransformerFormInfos extends ElementInfosWithProperties
5757
@JsonInclude(JsonInclude.Include.NON_NULL)
5858
private Double i2;
5959

60+
// TODO : remove currentLimits1 and 2 to leave only currentLimits when modification is done
6061
@JsonInclude(JsonInclude.Include.NON_EMPTY)
6162
private List<CurrentLimitsData> currentLimits1;
6263

6364
@JsonInclude(JsonInclude.Include.NON_EMPTY)
6465
private List<CurrentLimitsData> currentLimits2;
6566

67+
@JsonInclude(JsonInclude.Include.NON_EMPTY)
68+
private List<CurrentLimitsData> currentLimits;
69+
6670
@JsonInclude(JsonInclude.Include.NON_NULL)
6771
private String selectedOperationalLimitsGroup1;
6872

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

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -65,9 +65,11 @@ private static LineFormInfos toFormInfos(Identifiable<?> identifiable) {
6565
.b1(line.getB1())
6666
.g2(line.getG2())
6767
.b2(line.getB2())
68+
.properties(getProperties(line))
6869
.selectedOperationalLimitsGroup1(line.getSelectedOperationalLimitsGroupId1().orElse(null))
69-
.selectedOperationalLimitsGroup2(line.getSelectedOperationalLimitsGroupId2().orElse(null))
70-
.properties(getProperties(line));
70+
.selectedOperationalLimitsGroup2(line.getSelectedOperationalLimitsGroupId2().orElse(null));
71+
72+
mergeCurrentLimits(line.getOperationalLimitsGroups1(), line.getOperationalLimitsGroups2(), builder::currentLimits);
7173

7274
buildCurrentLimits(line.getOperationalLimitsGroups1(), builder::currentLimits1);
7375
buildCurrentLimits(line.getOperationalLimitsGroups2(), builder::currentLimits2);
@@ -210,5 +212,4 @@ private static LineTooltipInfos toTooltipInfos(Identifiable<?> identifiable, Dou
210212

211213
return builder.build();
212214
}
213-
214215
}

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

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,8 +66,6 @@ private static TwoWindingsTransformerFormInfos toFormInfos(Identifiable<?> ident
6666
.g(twoWT.getG())
6767
.ratedU1(twoWT.getRatedU1())
6868
.ratedU2(twoWT.getRatedU2())
69-
.selectedOperationalLimitsGroup1(twoWT.getSelectedOperationalLimitsGroupId1().orElse(null))
70-
.selectedOperationalLimitsGroup2(twoWT.getSelectedOperationalLimitsGroupId2().orElse(null))
7169
.properties(getProperties(twoWT));
7270

7371
builder.busOrBusbarSectionId1(getBusOrBusbarSection(terminal1))
@@ -79,6 +77,10 @@ private static TwoWindingsTransformerFormInfos toFormInfos(Identifiable<?> ident
7977
builder.q2(nullIfNan(terminal2.getQ()));
8078
builder.i1(nullIfNan(terminal1.getI()));
8179
builder.i2(nullIfNan(terminal2.getI()));
80+
builder.selectedOperationalLimitsGroup1(twoWT.getSelectedOperationalLimitsGroupId1().orElse(null));
81+
builder.selectedOperationalLimitsGroup2(twoWT.getSelectedOperationalLimitsGroupId2().orElse(null));
82+
83+
mergeCurrentLimits(twoWT.getOperationalLimitsGroups1(), twoWT.getOperationalLimitsGroups2(), builder::currentLimits);
8284

8385
buildCurrentLimits(twoWT.getOperationalLimitsGroups1(), builder::currentLimits1);
8486
buildCurrentLimits(twoWT.getOperationalLimitsGroups2(), builder::currentLimits2);

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

Lines changed: 85 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import org.gridsuite.network.map.dto.definition.threewindingstransformer.ThreeWindingsTransformerTabInfos;
1616
import org.springframework.util.CollectionUtils;
1717

18+
import java.util.ArrayList;
1819
import java.util.Collection;
1920
import java.util.HashMap;
2021
import java.util.List;
@@ -24,6 +25,8 @@
2425
import java.util.function.Function;
2526
import java.util.stream.Collectors;
2627

28+
import static org.gridsuite.network.map.dto.common.CurrentLimitsData.Applicability.*;
29+
2730
/**
2831
* @author Slimane Amar <slimane.amar at rte-france.com>
2932
*/
@@ -83,14 +86,94 @@ public static Optional<HvdcOperatorActivePowerRangeInfos> toHvdcOperatorActivePo
8386

8487
public static void buildCurrentLimits(Collection<OperationalLimitsGroup> currentLimits, Consumer<List<CurrentLimitsData>> build) {
8588
List<CurrentLimitsData> currentLimitsData = currentLimits.stream()
86-
.map(
87-
ElementUtils::operationalLimitsGroupToMapDataCurrentLimits)
89+
.map(ElementUtils::operationalLimitsGroupToMapDataCurrentLimits)
8890
.toList();
8991
if (!currentLimitsData.isEmpty()) {
9092
build.accept(currentLimitsData);
9193
}
9294
}
9395

96+
private static CurrentLimitsData copyCurrentLimitsData(CurrentLimitsData currentLimitsData, CurrentLimitsData.Applicability applicability) {
97+
return CurrentLimitsData.builder()
98+
.id(currentLimitsData.getId())
99+
.applicability(applicability)
100+
.temporaryLimits(currentLimitsData.getTemporaryLimits())
101+
.permanentLimit(currentLimitsData.getPermanentLimit()).build();
102+
}
103+
104+
/**
105+
* @return id of the selected operation limits group 1 and 2 if they have been renamed
106+
*/
107+
public static void mergeCurrentLimits(Collection<OperationalLimitsGroup> operationalLimitsGroups1,
108+
Collection<OperationalLimitsGroup> operationalLimitsGroups2,
109+
Consumer<List<CurrentLimitsData>> build) {
110+
List<CurrentLimitsData> mergedLimitsData = new ArrayList<>();
111+
112+
// Build temporary limit from side 1 and 2
113+
List<CurrentLimitsData> currentLimitsData1 = operationalLimitsGroups1.stream()
114+
.map(ElementUtils::operationalLimitsGroupToMapDataCurrentLimits).toList();
115+
ArrayList<CurrentLimitsData> currentLimitsData2 = new ArrayList<>(operationalLimitsGroups2.stream()
116+
.map(ElementUtils::operationalLimitsGroupToMapDataCurrentLimits).toList());
117+
118+
// combine 2 sides in one list
119+
120+
// simple case : one of the arrays are empty
121+
if (currentLimitsData2.isEmpty() && !currentLimitsData1.isEmpty()) {
122+
for (CurrentLimitsData currentLimitsData : currentLimitsData1) {
123+
mergedLimitsData.add(copyCurrentLimitsData(currentLimitsData, SIDE1));
124+
}
125+
build.accept(mergedLimitsData);
126+
return;
127+
}
128+
if (currentLimitsData1.isEmpty() && !currentLimitsData2.isEmpty()) {
129+
for (CurrentLimitsData currentLimitsData : currentLimitsData2) {
130+
mergedLimitsData.add(copyCurrentLimitsData(currentLimitsData, SIDE2));
131+
}
132+
build.accept(mergedLimitsData);
133+
return;
134+
}
135+
136+
// more complex case
137+
for (CurrentLimitsData limitsData : currentLimitsData1) {
138+
Optional<CurrentLimitsData> l2 = currentLimitsData2.stream().filter(l -> l.getId().equals(limitsData.getId())).findFirst();
139+
140+
if (l2.isPresent()) {
141+
CurrentLimitsData limitsData2 = l2.get();
142+
// Only side one has limits
143+
if (limitsData.hasLimits() && !limitsData2.hasLimits()) {
144+
mergedLimitsData.add(copyCurrentLimitsData(limitsData, SIDE1));
145+
// only side two has limits
146+
} else if (limitsData2.hasLimits() && !limitsData.hasLimits()) {
147+
mergedLimitsData.add(copyCurrentLimitsData(limitsData2, SIDE2));
148+
} else {
149+
// both sides have limits and limits are equals
150+
if (limitsData.limitsEquals(limitsData2)) {
151+
mergedLimitsData.add(copyCurrentLimitsData(limitsData, EQUIPMENT));
152+
// both side have limits and they are different : create 2 different limit sets
153+
} else {
154+
// Side 1
155+
mergedLimitsData.add(copyCurrentLimitsData(limitsData, SIDE1));
156+
// Side 2
157+
mergedLimitsData.add(copyCurrentLimitsData(limitsData2, SIDE2));
158+
}
159+
}
160+
// remove processed limits from side 2
161+
currentLimitsData2.remove(l2.get());
162+
} else {
163+
mergedLimitsData.add(copyCurrentLimitsData(limitsData, SIDE1));
164+
}
165+
}
166+
167+
// add remaining limits from side 2
168+
for (CurrentLimitsData limitsData : currentLimitsData2) {
169+
mergedLimitsData.add(copyCurrentLimitsData(limitsData, SIDE2));
170+
}
171+
172+
if (!mergedLimitsData.isEmpty()) {
173+
build.accept(mergedLimitsData);
174+
}
175+
}
176+
94177
public static Optional<StandbyAutomatonInfos> toStandbyAutomaton(StaticVarCompensator staticVarCompensator) {
95178
StandbyAutomaton standbyAutomatonInfos = staticVarCompensator.getExtension(StandbyAutomaton.class);
96179
return standbyAutomatonInfos == null ? Optional.empty() :

src/test/java/org/gridsuite/network/map/NetworkMapControllerTest.java

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -485,6 +485,23 @@ void setUp() {
485485
.withObservable(true)
486486
.add();
487487

488+
line3.newOperationalLimitsGroup1("group1").newCurrentLimits()
489+
.setPermanentLimit(220.0)
490+
.beginTemporaryLimit()
491+
.setName("temporary1")
492+
.setAcceptableDuration(100)
493+
.setValue(50.)
494+
.setFictitious(false)
495+
.endTemporaryLimit()
496+
.beginTemporaryLimit()
497+
.setName("temporary2")
498+
.setAcceptableDuration(150)
499+
.setValue(70.)
500+
.setFictitious(false)
501+
.endTemporaryLimit()
502+
.add();
503+
line3.setSelectedOperationalLimitsGroup1("group1");
504+
488505
Substation p6 = network.newSubstation()
489506
.setId("P6")
490507
.setCountry(Country.FR)
@@ -515,6 +532,24 @@ void setUp() {
515532
.setB2(386E-6 / 2)
516533
.add();
517534

535+
Line line4 = network.getLine("LINE4");
536+
line4.newOperationalLimitsGroup2("group1").newCurrentLimits()
537+
.setPermanentLimit(220.0)
538+
.beginTemporaryLimit()
539+
.setName("temporary1")
540+
.setAcceptableDuration(100)
541+
.setValue(50.)
542+
.setFictitious(false)
543+
.endTemporaryLimit()
544+
.beginTemporaryLimit()
545+
.setName("temporary2")
546+
.setAcceptableDuration(150)
547+
.setValue(70.)
548+
.setFictitious(false)
549+
.endTemporaryLimit()
550+
.add();
551+
line4.setSelectedOperationalLimitsGroup2("group1");
552+
518553
Battery b1 = vlnew2.newBattery()
519554
.setId("BATTERY1")
520555
.setName("BATTERY1")

src/test/resources/2-windings-transformer-map-data.json

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,30 @@
1515
{
1616
"id" : "limit set 1",
1717
"permanentLimit":750.4,
18-
"temporaryLimits":[{"name":"IT5","acceptableDuration":2087,"value":300}]
18+
"temporaryLimits":[{"name":"IT5","acceptableDuration":2087,"value":300}],
19+
"applicability": null
1920
}
2021
],
2122
"currentLimits2": [
2223
{
2324
"id" : "limit set 1",
2425
"permanentLimit":780.6,
25-
"temporaryLimits":[{"name":"N/A","acceptableDuration":664,"value":2147483647},{"name":"IT20","acceptableDuration":961,"value":1200}]
26+
"temporaryLimits":[{"name":"N/A","acceptableDuration":664,"value":2147483647},{"name":"IT20","acceptableDuration":961,"value":1200}],
27+
"applicability": null
28+
}
29+
],
30+
"currentLimits": [
31+
{
32+
"id" : "limit set 1",
33+
"permanentLimit":750.4,
34+
"temporaryLimits":[{"name":"IT5","acceptableDuration":2087,"value":300}],
35+
"applicability": "SIDE1"
36+
},
37+
{
38+
"id" : "limit set 1",
39+
"permanentLimit":780.6,
40+
"temporaryLimits":[{"name":"N/A","acceptableDuration":664,"value":2147483647},{"name":"IT20","acceptableDuration":961,"value":1200}],
41+
"applicability": "SIDE2"
2642
}
2743
],
2844
"selectedOperationalLimitsGroup1": "limit set 1",

src/test/resources/2-windings-transformer-tooltip-data.json

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,16 @@
66
"permanentLimit": 750.4,
77
"temporaryLimits": [
88
{ "name": "IT5", "value": 300.0, "acceptableDuration": 2087 }
9-
]
9+
],
10+
"applicability": null
1011
},
1112
"currentLimits2": {
1213
"permanentLimit": 780.6,
1314
"temporaryLimits": [
1415
{ "name": "IT20", "value": 1200.0, "acceptableDuration": 961 },
1516
{ "name": "N/A", "value": 2.147483647e9, "acceptableDuration": 664 }
16-
]
17+
],
18+
"applicability": null
1719
},
1820
"r": 0.26658461538461536,
1921
"x": 11.104492831516762,

src/test/resources/2-windings-transformers-tab-data.json

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,8 @@
2323
"value": 300.0,
2424
"acceptableDuration": 2087
2525
}
26-
]
26+
],
27+
"applicability": null
2728
}
2829
},
2930
"operationalLimitsGroup1Names": [
@@ -44,7 +45,8 @@
4445
"value": 2.147483647E9,
4546
"acceptableDuration": 664
4647
}
47-
]
48+
],
49+
"applicability": null
4850
}
4951
},
5052
"operationalLimitsGroup2Names": [
@@ -200,7 +202,8 @@
200202
"value": 400.0,
201203
"acceptableDuration": 87
202204
}
203-
]
205+
],
206+
"applicability": null
204207
}
205208
},
206209
"operationalLimitsGroup1Names": ["DEFAULT"],
@@ -214,7 +217,8 @@
214217
"value": 98.0,
215218
"acceptableDuration": 34
216219
}
217-
]
220+
],
221+
"applicability": null
218222
}
219223
},
220224
"operationalLimitsGroup2Names": ["DEFAULT"],

0 commit comments

Comments
 (0)