From 35c6e0530949995d4305ced0714a545e0b41ef1c Mon Sep 17 00:00:00 2001 From: basseche Date: Thu, 3 Jul 2025 10:27:34 +0200 Subject: [PATCH 01/22] Add new attribute for lineFormInfos dto Signed-off-by: basseche --- .../map/dto/common/CurrentLimitsData.java | 23 ++++++ .../map/dto/common/TemporaryLimitData.java | 2 + .../dto/definition/line/LineFormInfos.java | 3 + .../map/dto/mapper/LineInfosMapper.java | 3 +- .../network/map/dto/utils/ElementUtils.java | 71 +++++++++++++++++++ 5 files changed, 101 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/gridsuite/network/map/dto/common/CurrentLimitsData.java b/src/main/java/org/gridsuite/network/map/dto/common/CurrentLimitsData.java index 1fb636cc..aa314a95 100644 --- a/src/main/java/org/gridsuite/network/map/dto/common/CurrentLimitsData.java +++ b/src/main/java/org/gridsuite/network/map/dto/common/CurrentLimitsData.java @@ -7,9 +7,12 @@ package org.gridsuite.network.map.dto.common; import com.fasterxml.jackson.annotation.JsonInclude; +import com.powsybl.iidm.network.LoadingLimits; import lombok.Builder; import lombok.EqualsAndHashCode; import lombok.Getter; +import lombok.Setter; +import org.springframework.util.CollectionUtils; import java.util.List; @@ -19,6 +22,7 @@ */ @Builder @Getter +@Setter @EqualsAndHashCode public class CurrentLimitsData { // may be null in case we just need the selected limit set and don't really need its name/id @@ -30,5 +34,24 @@ public class CurrentLimitsData { @JsonInclude(JsonInclude.Include.NON_NULL) private List temporaryLimits; + + @JsonInclude + private Applicability applicability; + + public enum Applicability { + EQUIPMENT, + SIDE1, + SIDE2, + } + + public boolean hasLimits() { + return !Double.isNaN(permanentLimit) || !CollectionUtils.isEmpty(temporaryLimits); + } + + public boolean limitsEquals(CurrentLimitsData other) { + return permanentLimit != null && permanentLimit.equals(other.permanentLimit) + && (temporaryLimits != null && temporaryLimits.equals(other.temporaryLimits) + || temporaryLimits == null && other.temporaryLimits == null); + } } diff --git a/src/main/java/org/gridsuite/network/map/dto/common/TemporaryLimitData.java b/src/main/java/org/gridsuite/network/map/dto/common/TemporaryLimitData.java index 3c5e1a74..377e8a84 100644 --- a/src/main/java/org/gridsuite/network/map/dto/common/TemporaryLimitData.java +++ b/src/main/java/org/gridsuite/network/map/dto/common/TemporaryLimitData.java @@ -10,12 +10,14 @@ import lombok.Builder; import lombok.EqualsAndHashCode; import lombok.Getter; +import lombok.Setter; /** * @author David Braquart */ @Builder @Getter +@Setter @EqualsAndHashCode public class TemporaryLimitData { private String name; diff --git a/src/main/java/org/gridsuite/network/map/dto/definition/line/LineFormInfos.java b/src/main/java/org/gridsuite/network/map/dto/definition/line/LineFormInfos.java index f294e3df..cd169b0e 100644 --- a/src/main/java/org/gridsuite/network/map/dto/definition/line/LineFormInfos.java +++ b/src/main/java/org/gridsuite/network/map/dto/definition/line/LineFormInfos.java @@ -55,6 +55,9 @@ public class LineFormInfos extends ElementInfosWithProperties { @JsonInclude(JsonInclude.Include.NON_NULL) private Double i2; + @JsonInclude(JsonInclude.Include.NON_EMPTY) + private List currentLimits; + @JsonInclude(JsonInclude.Include.NON_EMPTY) private List currentLimits1; diff --git a/src/main/java/org/gridsuite/network/map/dto/mapper/LineInfosMapper.java b/src/main/java/org/gridsuite/network/map/dto/mapper/LineInfosMapper.java index 4979f016..4aaec001 100644 --- a/src/main/java/org/gridsuite/network/map/dto/mapper/LineInfosMapper.java +++ b/src/main/java/org/gridsuite/network/map/dto/mapper/LineInfosMapper.java @@ -72,6 +72,8 @@ private static LineFormInfos toFormInfos(Identifiable identifiable) { buildCurrentLimits(line.getOperationalLimitsGroups1(), builder::currentLimits1); buildCurrentLimits(line.getOperationalLimitsGroups2(), builder::currentLimits2); + builder.currentLimits(mergeCurrentLimits(line.getOperationalLimitsGroups1(), line.getOperationalLimitsGroups2())); + builder.busOrBusbarSectionId1(getBusOrBusbarSection(terminal1)) .busOrBusbarSectionId2(getBusOrBusbarSection(terminal2)); @@ -210,5 +212,4 @@ private static LineTooltipInfos toTooltipInfos(Identifiable identifiable, Dou return builder.build(); } - } diff --git a/src/main/java/org/gridsuite/network/map/dto/utils/ElementUtils.java b/src/main/java/org/gridsuite/network/map/dto/utils/ElementUtils.java index cc0431a5..251d5659 100644 --- a/src/main/java/org/gridsuite/network/map/dto/utils/ElementUtils.java +++ b/src/main/java/org/gridsuite/network/map/dto/utils/ElementUtils.java @@ -15,6 +15,7 @@ import org.gridsuite.network.map.dto.definition.threewindingstransformer.ThreeWindingsTransformerTabInfos; import org.springframework.util.CollectionUtils; +import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.List; @@ -91,6 +92,76 @@ public static void buildCurrentLimits(Collection current } } + private static String generateSetName(String basicName, String suffix, List mergedList, List otherList) { + + boolean nameUsed; + String strIncrement = ""; + int increment = 1; + + do { + String currentId = basicName + suffix + strIncrement; + if (!mergedList.stream().filter(l -> l.getId().equals(currentId)).toList().isEmpty() + || !otherList.stream().filter(l -> l.getId().equals(currentId)).toList().isEmpty()) { + nameUsed = true; + increment++; + strIncrement = "(" + increment + ")"; + } else { + nameUsed = false; + } + } while (nameUsed); + + return basicName + suffix + strIncrement; + } + + public static List mergeCurrentLimits(Collection operationalLimitsGroups1, + Collection operationalLimitsGroups2) { + List currentLimitsData1 = operationalLimitsGroups1.stream() + .map(ElementUtils::operationalLimitsGroupToMapDataCurrentLimits).toList(); + List currentLimitsData2 = operationalLimitsGroups2.stream() + .map(ElementUtils::operationalLimitsGroupToMapDataCurrentLimits).toList(); + + final String orSuffix = "_OR"; + final String exSuffix = "_EX"; + + List mergedLimitsData = new ArrayList<>(currentLimitsData1); + for (CurrentLimitsData limitsData : mergedLimitsData) { + if (limitsData.hasLimits()) { + limitsData.setApplicability(CurrentLimitsData.Applicability.SIDE1); + } + } + + for (CurrentLimitsData limitsData : currentLimitsData2) { + // Find limit Set by id + Optional currentLimit = mergedLimitsData.stream().filter(l -> l.getId().equals(limitsData.getId())).findFirst(); + if (currentLimit.isEmpty()) { + limitsData.setApplicability(CurrentLimitsData.Applicability.SIDE2); + mergedLimitsData.add(limitsData); + continue; + } + + CurrentLimitsData currentLimitData = currentLimit.get(); + + // Applicability + if (currentLimitData.hasLimits()) { + if (limitsData.hasLimits()) { + if (currentLimitData.limitsEquals(limitsData)) { + currentLimitData.setApplicability(CurrentLimitsData.Applicability.EQUIPMENT); + } else { + String currentLimitId = currentLimitData.getId(); + currentLimitData.setId(generateSetName(currentLimitId, orSuffix, mergedLimitsData, currentLimitsData2)); + limitsData.setApplicability(CurrentLimitsData.Applicability.SIDE2); + limitsData.setId(generateSetName(currentLimitId, exSuffix, mergedLimitsData, currentLimitsData2)); + mergedLimitsData.add(limitsData); + } + } + } else if (limitsData.hasLimits()) { + currentLimitData.setApplicability(CurrentLimitsData.Applicability.SIDE2); + } + + } + return mergedLimitsData; + } + public static Optional toStandbyAutomaton(StaticVarCompensator staticVarCompensator) { StandbyAutomaton standbyAutomatonInfos = staticVarCompensator.getExtension(StandbyAutomaton.class); return standbyAutomatonInfos == null ? Optional.empty() : From 2ea191131fdeb09a6ab120ac84678772b052d4ca Mon Sep 17 00:00:00 2001 From: basseche Date: Fri, 4 Jul 2025 14:46:12 +0200 Subject: [PATCH 02/22] Fix selected Limits Group name Signed-off-by: basseche --- .../map/dto/mapper/LineInfosMapper.java | 4 +- .../network/map/dto/utils/ElementUtils.java | 38 +++++++++++++++---- 2 files changed, 34 insertions(+), 8 deletions(-) diff --git a/src/main/java/org/gridsuite/network/map/dto/mapper/LineInfosMapper.java b/src/main/java/org/gridsuite/network/map/dto/mapper/LineInfosMapper.java index 4aaec001..933fff46 100644 --- a/src/main/java/org/gridsuite/network/map/dto/mapper/LineInfosMapper.java +++ b/src/main/java/org/gridsuite/network/map/dto/mapper/LineInfosMapper.java @@ -72,7 +72,9 @@ private static LineFormInfos toFormInfos(Identifiable identifiable) { buildCurrentLimits(line.getOperationalLimitsGroups1(), builder::currentLimits1); buildCurrentLimits(line.getOperationalLimitsGroups2(), builder::currentLimits2); - builder.currentLimits(mergeCurrentLimits(line.getOperationalLimitsGroups1(), line.getOperationalLimitsGroups2())); + mergeCurrentLimits(line.getOperationalLimitsGroups1(), line.getOperationalLimitsGroups2(), line.getSelectedOperationalLimitsGroupId1().orElse(null), + line.getSelectedOperationalLimitsGroupId2().orElse(null), builder::currentLimits, builder::selectedOperationalLimitsGroup1, + builder::selectedOperationalLimitsGroup2); builder.busOrBusbarSectionId1(getBusOrBusbarSection(terminal1)) .busOrBusbarSectionId2(getBusOrBusbarSection(terminal2)); diff --git a/src/main/java/org/gridsuite/network/map/dto/utils/ElementUtils.java b/src/main/java/org/gridsuite/network/map/dto/utils/ElementUtils.java index 251d5659..7afbe4d9 100644 --- a/src/main/java/org/gridsuite/network/map/dto/utils/ElementUtils.java +++ b/src/main/java/org/gridsuite/network/map/dto/utils/ElementUtils.java @@ -113,8 +113,11 @@ private static String generateSetName(String basicName, String suffix, List mergeCurrentLimits(Collection operationalLimitsGroups1, - Collection operationalLimitsGroups2) { + public static void mergeCurrentLimits(Collection operationalLimitsGroups1, + Collection operationalLimitsGroups2, + String selectedLimitsGroup1, String selectedLimitsGroup2, + Consumer> build, Consumer buildSelected1, + Consumer buildSelected2) { List currentLimitsData1 = operationalLimitsGroups1.stream() .map(ElementUtils::operationalLimitsGroupToMapDataCurrentLimits).toList(); List currentLimitsData2 = operationalLimitsGroups2.stream() @@ -122,6 +125,8 @@ public static List mergeCurrentLimits(Collection mergedLimitsData = new ArrayList<>(currentLimitsData1); for (CurrentLimitsData limitsData : mergedLimitsData) { @@ -140,26 +145,45 @@ public static List mergeCurrentLimits(Collection toStandbyAutomaton(StaticVarCompensator staticVarCompensator) { From 4ddf83753d9a17996be89766a10ea7d46de07eb9 Mon Sep 17 00:00:00 2001 From: basseche Date: Wed, 9 Jul 2025 12:59:06 +0200 Subject: [PATCH 03/22] Improve function Signed-off-by: basseche --- .../map/dto/common/CurrentLimitsData.java | 3 - .../map/dto/common/TemporaryLimitData.java | 2 - .../network/map/dto/utils/ElementUtils.java | 105 ++++++++++++------ 3 files changed, 69 insertions(+), 41 deletions(-) diff --git a/src/main/java/org/gridsuite/network/map/dto/common/CurrentLimitsData.java b/src/main/java/org/gridsuite/network/map/dto/common/CurrentLimitsData.java index aa314a95..0a563eb7 100644 --- a/src/main/java/org/gridsuite/network/map/dto/common/CurrentLimitsData.java +++ b/src/main/java/org/gridsuite/network/map/dto/common/CurrentLimitsData.java @@ -7,11 +7,9 @@ package org.gridsuite.network.map.dto.common; import com.fasterxml.jackson.annotation.JsonInclude; -import com.powsybl.iidm.network.LoadingLimits; import lombok.Builder; import lombok.EqualsAndHashCode; import lombok.Getter; -import lombok.Setter; import org.springframework.util.CollectionUtils; import java.util.List; @@ -22,7 +20,6 @@ */ @Builder @Getter -@Setter @EqualsAndHashCode public class CurrentLimitsData { // may be null in case we just need the selected limit set and don't really need its name/id diff --git a/src/main/java/org/gridsuite/network/map/dto/common/TemporaryLimitData.java b/src/main/java/org/gridsuite/network/map/dto/common/TemporaryLimitData.java index 377e8a84..3c5e1a74 100644 --- a/src/main/java/org/gridsuite/network/map/dto/common/TemporaryLimitData.java +++ b/src/main/java/org/gridsuite/network/map/dto/common/TemporaryLimitData.java @@ -10,14 +10,12 @@ import lombok.Builder; import lombok.EqualsAndHashCode; import lombok.Getter; -import lombok.Setter; /** * @author David Braquart */ @Builder @Getter -@Setter @EqualsAndHashCode public class TemporaryLimitData { private String name; diff --git a/src/main/java/org/gridsuite/network/map/dto/utils/ElementUtils.java b/src/main/java/org/gridsuite/network/map/dto/utils/ElementUtils.java index 7afbe4d9..2056ca5d 100644 --- a/src/main/java/org/gridsuite/network/map/dto/utils/ElementUtils.java +++ b/src/main/java/org/gridsuite/network/map/dto/utils/ElementUtils.java @@ -25,6 +25,8 @@ import java.util.function.Function; import java.util.stream.Collectors; +import static org.gridsuite.network.map.dto.common.CurrentLimitsData.Applicability.*; + /** * @author Slimane Amar */ @@ -113,68 +115,99 @@ private static String generateSetName(String basicName, String suffix, List operationalLimitsGroups1, Collection operationalLimitsGroups2, String selectedLimitsGroup1, String selectedLimitsGroup2, Consumer> build, Consumer buildSelected1, Consumer buildSelected2) { - List currentLimitsData1 = operationalLimitsGroups1.stream() - .map(ElementUtils::operationalLimitsGroupToMapDataCurrentLimits).toList(); - List currentLimitsData2 = operationalLimitsGroups2.stream() - .map(ElementUtils::operationalLimitsGroupToMapDataCurrentLimits).toList(); - final String orSuffix = "_OR"; final String exSuffix = "_EX"; String changedSelectedLimitsGroup1 = ""; String changedSelectedLimitsGroup2 = ""; + List mergedLimitsData = new ArrayList<>(); - List mergedLimitsData = new ArrayList<>(currentLimitsData1); - for (CurrentLimitsData limitsData : mergedLimitsData) { - if (limitsData.hasLimits()) { - limitsData.setApplicability(CurrentLimitsData.Applicability.SIDE1); - } - } + // Build temporary limit from side 1 and 2 + List currentLimitsData1 = operationalLimitsGroups1.stream() + .map(ElementUtils::operationalLimitsGroupToMapDataCurrentLimits).toList(); + ArrayList currentLimitsData2 = new ArrayList<>(operationalLimitsGroups2.stream() + .map(ElementUtils::operationalLimitsGroupToMapDataCurrentLimits).toList()); - for (CurrentLimitsData limitsData : currentLimitsData2) { - // Find limit Set by id - Optional currentLimit = mergedLimitsData.stream().filter(l -> l.getId().equals(limitsData.getId())).findFirst(); - if (currentLimit.isEmpty()) { - limitsData.setApplicability(CurrentLimitsData.Applicability.SIDE2); - mergedLimitsData.add(limitsData); - continue; - } + // combine 2 sides in one list - CurrentLimitsData currentLimitData = currentLimit.get(); - if (currentLimitData.hasLimits()) { - if (limitsData.hasLimits()) { - // if Limits sets have same limits : change applicability to equipment - // if They are different : create 2 limit sets with OR / EX suffix - if (currentLimitData.limitsEquals(limitsData)) { - currentLimitData.setApplicability(CurrentLimitsData.Applicability.EQUIPMENT); + // simple case : one of the arrays are empty + if (currentLimitsData2.isEmpty() && !currentLimitsData1.isEmpty()) { + for (CurrentLimitsData currentLimitsData : currentLimitsData1) { + mergedLimitsData.add(duplicateCurrentLimitsData(currentLimitsData, SIDE1)); + } + build.accept(mergedLimitsData); + return; + } else if (currentLimitsData1.isEmpty() && !currentLimitsData2.isEmpty()) { + for (CurrentLimitsData currentLimitsData : currentLimitsData2) { + mergedLimitsData.add(duplicateCurrentLimitsData(currentLimitsData, SIDE2)); + } + build.accept(mergedLimitsData); + return; + } + + // more complex case + for (CurrentLimitsData limitsData : currentLimitsData1) { + Optional l2 = currentLimitsData2.stream().filter(l -> l.getId().equals(limitsData.getId())).findFirst(); + + if (l2.isPresent()) { + CurrentLimitsData limitsData2 = l2.get(); + // Only side one has limits + if (limitsData.hasLimits() && !limitsData2.hasLimits()) { + mergedLimitsData.add(duplicateCurrentLimitsData(limitsData, SIDE1)); + // only side two has limits + } else if (limitsData2.hasLimits() && !limitsData.hasLimits()) { + mergedLimitsData.add(duplicateCurrentLimitsData(limitsData2, SIDE2)); + } else { + // both sides have limits and limits are equals + if (limitsData.limitsEquals(limitsData2)) { + mergedLimitsData.add(duplicateCurrentLimitsData(limitsData, EQUIPMENT)); + // both side have limits and they are differents : create 2 differents limitset with basename_Or and _Ex } else { - // OR Limits Set - String currentLimitId = currentLimitData.getId(); + String currentLimitId = limitsData.getId(); + // Side 1 String limitId = generateSetName(currentLimitId, orSuffix, mergedLimitsData, currentLimitsData2); - currentLimitData.setId(limitId); - limitsData.setApplicability(CurrentLimitsData.Applicability.SIDE2); + mergedLimitsData.add(duplicateCurrentLimitsData(limitsData, SIDE1, limitId)); + // if name changed and is active limit set change also selected limit set if (selectedLimitsGroup1.equals(currentLimitId)) { - // if name changed and is active limit set change also selected limit set changedSelectedLimitsGroup1 = limitId; } - // EX limits Set + // Side 2 limitId = generateSetName(currentLimitId, exSuffix, mergedLimitsData, currentLimitsData2); - limitsData.setId(limitId); + mergedLimitsData.add(duplicateCurrentLimitsData(limitsData, SIDE2, limitId)); + // if name changed and is active limit set change also selected limit set if (selectedLimitsGroup2.equals(currentLimitId)) { changedSelectedLimitsGroup2 = limitId; } - mergedLimitsData.add(limitsData); } } - } else if (limitsData.hasLimits()) { - currentLimitData.setApplicability(CurrentLimitsData.Applicability.SIDE2); + // remove processed limits from side 2 + currentLimitsData2.remove(l2.get()); + } else { + mergedLimitsData.add(duplicateCurrentLimitsData(limitsData, SIDE1)); } } + // add remaining limits from side 2 + for (CurrentLimitsData limitsData : currentLimitsData2) { + mergedLimitsData.add(duplicateCurrentLimitsData(limitsData, SIDE2)); + } + if (!mergedLimitsData.isEmpty()) { build.accept(mergedLimitsData); } From 5c50a384cc298be98c461a617a62ebe4ec46de80 Mon Sep 17 00:00:00 2001 From: basseche Date: Thu, 10 Jul 2025 10:28:01 +0200 Subject: [PATCH 04/22] fix merge function Signed-off-by: basseche --- .../network/map/dto/utils/ElementUtils.java | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/main/java/org/gridsuite/network/map/dto/utils/ElementUtils.java b/src/main/java/org/gridsuite/network/map/dto/utils/ElementUtils.java index 2056ca5d..ce393bf3 100644 --- a/src/main/java/org/gridsuite/network/map/dto/utils/ElementUtils.java +++ b/src/main/java/org/gridsuite/network/map/dto/utils/ElementUtils.java @@ -115,7 +115,7 @@ private static String generateSetName(String basicName, String suffix, List operationalLimitsGroups1, @@ -149,13 +149,13 @@ public static void mergeCurrentLimits(Collection operati // simple case : one of the arrays are empty if (currentLimitsData2.isEmpty() && !currentLimitsData1.isEmpty()) { for (CurrentLimitsData currentLimitsData : currentLimitsData1) { - mergedLimitsData.add(duplicateCurrentLimitsData(currentLimitsData, SIDE1)); + mergedLimitsData.add(copyCurrentLimitsData(currentLimitsData, SIDE1)); } build.accept(mergedLimitsData); return; } else if (currentLimitsData1.isEmpty() && !currentLimitsData2.isEmpty()) { for (CurrentLimitsData currentLimitsData : currentLimitsData2) { - mergedLimitsData.add(duplicateCurrentLimitsData(currentLimitsData, SIDE2)); + mergedLimitsData.add(copyCurrentLimitsData(currentLimitsData, SIDE2)); } build.accept(mergedLimitsData); return; @@ -169,27 +169,27 @@ public static void mergeCurrentLimits(Collection operati CurrentLimitsData limitsData2 = l2.get(); // Only side one has limits if (limitsData.hasLimits() && !limitsData2.hasLimits()) { - mergedLimitsData.add(duplicateCurrentLimitsData(limitsData, SIDE1)); + mergedLimitsData.add(copyCurrentLimitsData(limitsData, SIDE1)); // only side two has limits } else if (limitsData2.hasLimits() && !limitsData.hasLimits()) { - mergedLimitsData.add(duplicateCurrentLimitsData(limitsData2, SIDE2)); + mergedLimitsData.add(copyCurrentLimitsData(limitsData2, SIDE2)); } else { // both sides have limits and limits are equals if (limitsData.limitsEquals(limitsData2)) { - mergedLimitsData.add(duplicateCurrentLimitsData(limitsData, EQUIPMENT)); + mergedLimitsData.add(copyCurrentLimitsData(limitsData, EQUIPMENT)); // both side have limits and they are differents : create 2 differents limitset with basename_Or and _Ex } else { String currentLimitId = limitsData.getId(); // Side 1 String limitId = generateSetName(currentLimitId, orSuffix, mergedLimitsData, currentLimitsData2); - mergedLimitsData.add(duplicateCurrentLimitsData(limitsData, SIDE1, limitId)); + mergedLimitsData.add(copyCurrentLimitsData(limitsData, SIDE1, limitId)); // if name changed and is active limit set change also selected limit set if (selectedLimitsGroup1.equals(currentLimitId)) { changedSelectedLimitsGroup1 = limitId; } // Side 2 limitId = generateSetName(currentLimitId, exSuffix, mergedLimitsData, currentLimitsData2); - mergedLimitsData.add(duplicateCurrentLimitsData(limitsData, SIDE2, limitId)); + mergedLimitsData.add(copyCurrentLimitsData(limitsData2, SIDE2, limitId)); // if name changed and is active limit set change also selected limit set if (selectedLimitsGroup2.equals(currentLimitId)) { changedSelectedLimitsGroup2 = limitId; @@ -199,13 +199,13 @@ public static void mergeCurrentLimits(Collection operati // remove processed limits from side 2 currentLimitsData2.remove(l2.get()); } else { - mergedLimitsData.add(duplicateCurrentLimitsData(limitsData, SIDE1)); + mergedLimitsData.add(copyCurrentLimitsData(limitsData, SIDE1)); } } // add remaining limits from side 2 for (CurrentLimitsData limitsData : currentLimitsData2) { - mergedLimitsData.add(duplicateCurrentLimitsData(limitsData, SIDE2)); + mergedLimitsData.add(copyCurrentLimitsData(limitsData, SIDE2)); } if (!mergedLimitsData.isEmpty()) { From 1a3c417587a99ac388d6fa6cfbc804d7fcfcbf44 Mon Sep 17 00:00:00 2001 From: basseche Date: Thu, 10 Jul 2025 12:12:22 +0200 Subject: [PATCH 05/22] Change current limit group name if selected one is changed Signed-off-by: basseche --- .../TwoWindingsTransformerFormInfos.java | 4 ++ .../map/dto/mapper/LineInfosMapper.java | 17 ++++--- .../TwoWindingsTransformerInfosMapper.java | 15 ++++-- .../network/map/dto/utils/ElementUtils.java | 50 ++++++++++++------- 4 files changed, 57 insertions(+), 29 deletions(-) diff --git a/src/main/java/org/gridsuite/network/map/dto/definition/twowindingstransformer/TwoWindingsTransformerFormInfos.java b/src/main/java/org/gridsuite/network/map/dto/definition/twowindingstransformer/TwoWindingsTransformerFormInfos.java index f50a4d42..12606678 100644 --- a/src/main/java/org/gridsuite/network/map/dto/definition/twowindingstransformer/TwoWindingsTransformerFormInfos.java +++ b/src/main/java/org/gridsuite/network/map/dto/definition/twowindingstransformer/TwoWindingsTransformerFormInfos.java @@ -57,12 +57,16 @@ public class TwoWindingsTransformerFormInfos extends ElementInfosWithProperties @JsonInclude(JsonInclude.Include.NON_NULL) private Double i2; + // TODO : remove currentLimits1 and 2 to leave only currentLimits when modification is done @JsonInclude(JsonInclude.Include.NON_EMPTY) private List currentLimits1; @JsonInclude(JsonInclude.Include.NON_EMPTY) private List currentLimits2; + @JsonInclude(JsonInclude.Include.NON_EMPTY) + private List currentLimits; + @JsonInclude(JsonInclude.Include.NON_NULL) private String selectedOperationalLimitsGroup1; diff --git a/src/main/java/org/gridsuite/network/map/dto/mapper/LineInfosMapper.java b/src/main/java/org/gridsuite/network/map/dto/mapper/LineInfosMapper.java index 933fff46..b5880b3f 100644 --- a/src/main/java/org/gridsuite/network/map/dto/mapper/LineInfosMapper.java +++ b/src/main/java/org/gridsuite/network/map/dto/mapper/LineInfosMapper.java @@ -8,6 +8,7 @@ import com.powsybl.iidm.network.*; import com.powsybl.iidm.network.extensions.Measurement; +import org.apache.commons.lang3.tuple.Pair; import org.gridsuite.network.map.dto.ElementInfos; import org.gridsuite.network.map.dto.InfoTypeParameters; import org.gridsuite.network.map.dto.common.CurrentLimitsData; @@ -65,16 +66,18 @@ private static LineFormInfos toFormInfos(Identifiable identifiable) { .b1(line.getB1()) .g2(line.getG2()) .b2(line.getB2()) - .selectedOperationalLimitsGroup1(line.getSelectedOperationalLimitsGroupId1().orElse(null)) - .selectedOperationalLimitsGroup2(line.getSelectedOperationalLimitsGroupId2().orElse(null)) .properties(getProperties(line)); - buildCurrentLimits(line.getOperationalLimitsGroups1(), builder::currentLimits1); - buildCurrentLimits(line.getOperationalLimitsGroups2(), builder::currentLimits2); + Pair newSelectedOpLimitsGroups = mergeCurrentLimits(line.getOperationalLimitsGroups1(), line.getOperationalLimitsGroups2(), + line.getSelectedOperationalLimitsGroupId1().orElse(null), + line.getSelectedOperationalLimitsGroupId2().orElse(null), + builder::currentLimits); - mergeCurrentLimits(line.getOperationalLimitsGroups1(), line.getOperationalLimitsGroups2(), line.getSelectedOperationalLimitsGroupId1().orElse(null), - line.getSelectedOperationalLimitsGroupId2().orElse(null), builder::currentLimits, builder::selectedOperationalLimitsGroup1, - builder::selectedOperationalLimitsGroup2); + builder.selectedOperationalLimitsGroup1(!newSelectedOpLimitsGroups.getLeft().isEmpty() ? newSelectedOpLimitsGroups.getLeft() : line.getSelectedOperationalLimitsGroupId1().orElse(null)); + builder.selectedOperationalLimitsGroup2(!newSelectedOpLimitsGroups.getRight().isEmpty() ? newSelectedOpLimitsGroups.getRight() : line.getSelectedOperationalLimitsGroupId2().orElse(null)); + + buildCurrentLimits(line.getOperationalLimitsGroups1(), line.getSelectedOperationalLimitsGroupId1().orElse(null), newSelectedOpLimitsGroups.getLeft(), builder::currentLimits1); + buildCurrentLimits(line.getOperationalLimitsGroups2(), line.getSelectedOperationalLimitsGroupId2().orElse(null), newSelectedOpLimitsGroups.getRight(), builder::currentLimits2); builder.busOrBusbarSectionId1(getBusOrBusbarSection(terminal1)) .busOrBusbarSectionId2(getBusOrBusbarSection(terminal2)); diff --git a/src/main/java/org/gridsuite/network/map/dto/mapper/TwoWindingsTransformerInfosMapper.java b/src/main/java/org/gridsuite/network/map/dto/mapper/TwoWindingsTransformerInfosMapper.java index eeb81eab..1b7ac171 100644 --- a/src/main/java/org/gridsuite/network/map/dto/mapper/TwoWindingsTransformerInfosMapper.java +++ b/src/main/java/org/gridsuite/network/map/dto/mapper/TwoWindingsTransformerInfosMapper.java @@ -10,6 +10,7 @@ import com.powsybl.iidm.network.extensions.DiscreteMeasurement; import com.powsybl.iidm.network.extensions.Measurement; import com.powsybl.iidm.network.extensions.TwoWindingsTransformerToBeEstimated; +import org.apache.commons.lang3.tuple.Pair; import org.gridsuite.network.map.dto.ElementInfos; import org.gridsuite.network.map.dto.InfoTypeParameters; import org.gridsuite.network.map.dto.common.CurrentLimitsData; @@ -66,8 +67,6 @@ private static TwoWindingsTransformerFormInfos toFormInfos(Identifiable ident .g(twoWT.getG()) .ratedU1(twoWT.getRatedU1()) .ratedU2(twoWT.getRatedU2()) - .selectedOperationalLimitsGroup1(twoWT.getSelectedOperationalLimitsGroupId1().orElse(null)) - .selectedOperationalLimitsGroup2(twoWT.getSelectedOperationalLimitsGroupId2().orElse(null)) .properties(getProperties(twoWT)); builder.busOrBusbarSectionId1(getBusOrBusbarSection(terminal1)) @@ -80,8 +79,16 @@ private static TwoWindingsTransformerFormInfos toFormInfos(Identifiable ident builder.i1(nullIfNan(terminal1.getI())); builder.i2(nullIfNan(terminal2.getI())); - buildCurrentLimits(twoWT.getOperationalLimitsGroups1(), builder::currentLimits1); - buildCurrentLimits(twoWT.getOperationalLimitsGroups2(), builder::currentLimits2); + Pair newSelectedOpLimitsGroups = mergeCurrentLimits(twoWT.getOperationalLimitsGroups1(), twoWT.getOperationalLimitsGroups2(), + twoWT.getSelectedOperationalLimitsGroupId1().orElse(null), + twoWT.getSelectedOperationalLimitsGroupId2().orElse(null), + builder::currentLimits); + + builder.selectedOperationalLimitsGroup1(!newSelectedOpLimitsGroups.getLeft().isEmpty() ? newSelectedOpLimitsGroups.getLeft() : twoWT.getSelectedOperationalLimitsGroupId1().orElse(null)); + builder.selectedOperationalLimitsGroup2(!newSelectedOpLimitsGroups.getRight().isEmpty() ? newSelectedOpLimitsGroups.getRight() : twoWT.getSelectedOperationalLimitsGroupId2().orElse(null)); + + buildCurrentLimits(twoWT.getOperationalLimitsGroups1(), twoWT.getSelectedOperationalLimitsGroupId1().orElse(null), newSelectedOpLimitsGroups.getLeft(), builder::currentLimits1); + buildCurrentLimits(twoWT.getOperationalLimitsGroups2(), twoWT.getSelectedOperationalLimitsGroupId2().orElse(null), newSelectedOpLimitsGroups.getRight(), builder::currentLimits2); builder.operatingStatus(toOperatingStatus(twoWT)); builder.connectablePosition1(toMapConnectablePosition(twoWT, 1)) diff --git a/src/main/java/org/gridsuite/network/map/dto/utils/ElementUtils.java b/src/main/java/org/gridsuite/network/map/dto/utils/ElementUtils.java index ce393bf3..c2f4b094 100644 --- a/src/main/java/org/gridsuite/network/map/dto/utils/ElementUtils.java +++ b/src/main/java/org/gridsuite/network/map/dto/utils/ElementUtils.java @@ -10,6 +10,7 @@ import com.powsybl.iidm.network.*; import com.powsybl.iidm.network.extensions.*; import com.powsybl.math.graph.TraversalType; +import org.apache.commons.lang3.tuple.Pair; import org.gridsuite.network.map.dto.common.*; import org.gridsuite.network.map.dto.definition.extension.*; import org.gridsuite.network.map.dto.definition.threewindingstransformer.ThreeWindingsTransformerTabInfos; @@ -84,11 +85,22 @@ public static Optional toHvdcOperatorActivePo .oprFromCS2toCS1(hvdcOperatorActivePowerRange.getOprFromCS2toCS1()).build()); } - public static void buildCurrentLimits(Collection currentLimits, Consumer> build) { - List currentLimitsData = currentLimits.stream() - .map( - ElementUtils::operationalLimitsGroupToMapDataCurrentLimits) - .toList(); + public static void buildCurrentLimits(Collection currentLimits, String oldSelected, String newSelected, Consumer> build) { + + ArrayList currentLimitsData = new ArrayList<>(currentLimits.stream() + .map(ElementUtils::operationalLimitsGroupToMapDataCurrentLimits) + .toList()); + + // if selected operationalLimitsGroups renamed, rename it also here + if (!newSelected.isEmpty()) { + Optional limitsGroup = currentLimitsData.stream().filter(l -> l.getId().equals(oldSelected)).findFirst(); + if (limitsGroup.isPresent()) { + CurrentLimitsData current = copyCurrentLimitsData(limitsGroup.get(), newSelected); + currentLimitsData.remove(limitsGroup.get()); + currentLimitsData.add(current); + } + } + if (!currentLimitsData.isEmpty()) { build.accept(currentLimitsData); } @@ -127,11 +139,17 @@ private static CurrentLimitsData copyCurrentLimitsData(CurrentLimitsData current return copyCurrentLimitsData(currentLimitsData, applicability, ""); } - public static void mergeCurrentLimits(Collection operationalLimitsGroups1, - Collection operationalLimitsGroups2, - String selectedLimitsGroup1, String selectedLimitsGroup2, - Consumer> build, Consumer buildSelected1, - Consumer buildSelected2) { + private static CurrentLimitsData copyCurrentLimitsData(CurrentLimitsData currentLimitsData, String id) { + return CurrentLimitsData.builder() + .id(id.isEmpty() ? currentLimitsData.getId() : id) + .temporaryLimits(currentLimitsData.getTemporaryLimits()) + .permanentLimit(currentLimitsData.getPermanentLimit()).build(); + } + + public static Pair mergeCurrentLimits(Collection operationalLimitsGroups1, + Collection operationalLimitsGroups2, + String selectedLimitsGroup1, String selectedLimitsGroup2, + Consumer> build) { final String orSuffix = "_OR"; final String exSuffix = "_EX"; String changedSelectedLimitsGroup1 = ""; @@ -152,13 +170,13 @@ public static void mergeCurrentLimits(Collection operati mergedLimitsData.add(copyCurrentLimitsData(currentLimitsData, SIDE1)); } build.accept(mergedLimitsData); - return; + return Pair.of("", ""); } else if (currentLimitsData1.isEmpty() && !currentLimitsData2.isEmpty()) { for (CurrentLimitsData currentLimitsData : currentLimitsData2) { mergedLimitsData.add(copyCurrentLimitsData(currentLimitsData, SIDE2)); } build.accept(mergedLimitsData); - return; + return Pair.of("", ""); } // more complex case @@ -211,12 +229,8 @@ public static void mergeCurrentLimits(Collection operati if (!mergedLimitsData.isEmpty()) { build.accept(mergedLimitsData); } - if (!changedSelectedLimitsGroup1.isEmpty()) { - buildSelected1.accept(changedSelectedLimitsGroup1); - } - if (!changedSelectedLimitsGroup2.isEmpty()) { - buildSelected2.accept(changedSelectedLimitsGroup2); - } + + return Pair.of(changedSelectedLimitsGroup1, changedSelectedLimitsGroup2); } public static Optional toStandbyAutomaton(StaticVarCompensator staticVarCompensator) { From 00386fc5f7c37241e82081a784f6f3ce2cbb308a Mon Sep 17 00:00:00 2001 From: basseche Date: Thu, 10 Jul 2025 14:16:45 +0200 Subject: [PATCH 06/22] Fix Tests Signed-off-by: basseche --- .../2-windings-transformer-map-data.json | 28 ++++- .../2-windings-transformer-tooltip-data.json | 6 +- .../2-windings-transformers-tab-data.json | 12 +- src/test/resources/all-data-in-variant.json | 30 +++-- src/test/resources/all-data.json | 30 +++-- src/test/resources/line-form-data.json | 28 ++++- src/test/resources/line-tooltip-data.json | 6 +- src/test/resources/lines-form-data.json | 113 ++++++++++++++++-- 8 files changed, 203 insertions(+), 50 deletions(-) diff --git a/src/test/resources/2-windings-transformer-map-data.json b/src/test/resources/2-windings-transformer-map-data.json index 1326384f..ac97a5d8 100644 --- a/src/test/resources/2-windings-transformer-map-data.json +++ b/src/test/resources/2-windings-transformer-map-data.json @@ -13,20 +13,36 @@ "q2": 14.44, "currentLimits1": [ { - "id" : "limit set 1", + "id" : "limit set 1_OR", "permanentLimit":750.4, - "temporaryLimits":[{"name":"IT5","acceptableDuration":2087,"value":300}] + "temporaryLimits":[{"name":"IT5","acceptableDuration":2087,"value":300}], + "applicability": null } ], "currentLimits2": [ { - "id" : "limit set 1", + "id" : "limit set 1_EX", "permanentLimit":780.6, - "temporaryLimits":[{"name":"N/A","acceptableDuration":664,"value":2147483647},{"name":"IT20","acceptableDuration":961,"value":1200}] + "temporaryLimits":[{"name":"N/A","acceptableDuration":664,"value":2147483647},{"name":"IT20","acceptableDuration":961,"value":1200}], + "applicability": null } ], - "selectedOperationalLimitsGroup1": "limit set 1", - "selectedOperationalLimitsGroup2": "limit set 1", + "currentLimits": [ + { + "id" : "limit set 1_OR", + "permanentLimit":750.4, + "temporaryLimits":[{"name":"IT5","acceptableDuration":2087,"value":300}], + "applicability": "SIDE1" + }, + { + "id" : "limit set 1_EX", + "permanentLimit":780.6, + "temporaryLimits":[{"name":"N/A","acceptableDuration":664,"value":2147483647},{"name":"IT20","acceptableDuration":961,"value":1200}], + "applicability": "SIDE2" + } + ], + "selectedOperationalLimitsGroup1": "limit set 1_OR", + "selectedOperationalLimitsGroup2": "limit set 1_EX", "phaseTapChanger": { "lowTapPosition": 0, "highTapPosition": 1, diff --git a/src/test/resources/2-windings-transformer-tooltip-data.json b/src/test/resources/2-windings-transformer-tooltip-data.json index 79862354..57f7775d 100644 --- a/src/test/resources/2-windings-transformer-tooltip-data.json +++ b/src/test/resources/2-windings-transformer-tooltip-data.json @@ -6,14 +6,16 @@ "permanentLimit": 750.4, "temporaryLimits": [ { "name": "IT5", "value": 300.0, "acceptableDuration": 2087 } - ] + ], + "applicability": null }, "currentLimits2": { "permanentLimit": 780.6, "temporaryLimits": [ { "name": "IT20", "value": 1200.0, "acceptableDuration": 961 }, { "name": "N/A", "value": 2.147483647e9, "acceptableDuration": 664 } - ] + ], + "applicability": null }, "r": 0.26658461538461536, "x": 11.104492831516762, diff --git a/src/test/resources/2-windings-transformers-tab-data.json b/src/test/resources/2-windings-transformers-tab-data.json index 890d4ba0..515daf8d 100644 --- a/src/test/resources/2-windings-transformers-tab-data.json +++ b/src/test/resources/2-windings-transformers-tab-data.json @@ -23,7 +23,8 @@ "value": 300.0, "acceptableDuration": 2087 } - ] + ], + "applicability": null } }, "operationalLimitsGroup1Names": [ @@ -44,7 +45,8 @@ "value": 2.147483647E9, "acceptableDuration": 664 } - ] + ], + "applicability": null } }, "operationalLimitsGroup2Names": [ @@ -200,7 +202,8 @@ "value": 400.0, "acceptableDuration": 87 } - ] + ], + "applicability": null } }, "operationalLimitsGroup1Names": ["DEFAULT"], @@ -214,7 +217,8 @@ "value": 98.0, "acceptableDuration": 34 } - ] + ], + "applicability": null } }, "operationalLimitsGroup2Names": ["DEFAULT"], diff --git a/src/test/resources/all-data-in-variant.json b/src/test/resources/all-data-in-variant.json index e7c40164..95aa6f65 100644 --- a/src/test/resources/all-data-in-variant.json +++ b/src/test/resources/all-data-in-variant.json @@ -244,7 +244,8 @@ "value": 250.0, "acceptableDuration": 300 } - ] + ], + "applicability": null } }, "operationalLimitsGroup1Names": [ @@ -265,7 +266,8 @@ "value": 200.0, "acceptableDuration": 600 } - ] + ], + "applicability": null } }, "operationalLimitsGroup2Names": [ @@ -300,7 +302,8 @@ "value": 90.0, "acceptableDuration": 200 } - ] + ], + "applicability": null }, "group1": { "permanentLimit": 220.0, @@ -315,7 +318,8 @@ "value": 50.0, "acceptableDuration": 100 } - ] + ], + "applicability": null } }, "operationalLimitsGroup1Names": [ @@ -332,7 +336,8 @@ "value": 130.0, "acceptableDuration": 200 } - ] + ], + "applicability": null }, "group3": { "permanentLimit": 300.0, @@ -342,7 +347,8 @@ "value": 110.0, "acceptableDuration": 150 } - ] + ], + "applicability": null } }, "operationalLimitsGroup2Names": [ @@ -693,7 +699,8 @@ "value": 300.0, "acceptableDuration": 2087 } - ] + ], + "applicability": null } }, "operationalLimitsGroup1Names": ["limit set 1"], @@ -712,7 +719,8 @@ "value": 2.147483647e9, "acceptableDuration": 664 } - ] + ], + "applicability": null } }, "operationalLimitsGroup2Names": ["limit set 1"], @@ -866,7 +874,8 @@ "value": 400.0, "acceptableDuration": 87 } - ] + ], + "applicability": null } }, "operationalLimitsGroup1Names": ["DEFAULT"], @@ -880,7 +889,8 @@ "value": 98.0, "acceptableDuration": 34 } - ] + ], + "applicability": null } }, "operationalLimitsGroup2Names": ["DEFAULT"], diff --git a/src/test/resources/all-data.json b/src/test/resources/all-data.json index 2daaf690..c40d15b4 100644 --- a/src/test/resources/all-data.json +++ b/src/test/resources/all-data.json @@ -244,7 +244,8 @@ "value": 250.0, "acceptableDuration": 300 } - ] + ], + "applicability": null } }, "operationalLimitsGroup1Names": ["limit set 1"], @@ -263,7 +264,8 @@ "value": 200.0, "acceptableDuration": 600 } - ] + ], + "applicability": null } }, "operationalLimitsGroup2Names": ["limit set 1"], @@ -296,7 +298,8 @@ "value": 90.0, "acceptableDuration": 200 } - ] + ], + "applicability": null }, "group1": { "permanentLimit": 220.0, @@ -311,7 +314,8 @@ "value": 50.0, "acceptableDuration": 100 } - ] + ], + "applicability": null } }, "operationalLimitsGroup1Names": ["group2", "group1"], @@ -325,7 +329,8 @@ "value": 130.0, "acceptableDuration": 200 } - ] + ], + "applicability": null }, "group3": { "permanentLimit": 300.0, @@ -335,7 +340,8 @@ "value": 110.0, "acceptableDuration": 150 } - ] + ], + "applicability": null } }, "operationalLimitsGroup2Names": ["group4", "group3"], @@ -683,7 +689,8 @@ "value": 300.0, "acceptableDuration": 2087 } - ] + ], + "applicability": null } }, "operationalLimitsGroup1Names": [ @@ -704,7 +711,8 @@ "value": 2.147483647E9, "acceptableDuration": 664 } - ] + ], + "applicability": null } }, "operationalLimitsGroup2Names": [ @@ -860,7 +868,8 @@ "value": 400.0, "acceptableDuration": 87 } - ] + ], + "applicability": null } }, "operationalLimitsGroup1Names": ["DEFAULT"], @@ -874,7 +883,8 @@ "value": 98.0, "acceptableDuration": 34 } - ] + ], + "applicability": null } }, "operationalLimitsGroup2Names": ["DEFAULT"], diff --git a/src/test/resources/line-form-data.json b/src/test/resources/line-form-data.json index 5a42c1a3..a09ad28b 100644 --- a/src/test/resources/line-form-data.json +++ b/src/test/resources/line-form-data.json @@ -10,20 +10,36 @@ "q2": 4.44, "currentLimits1": [ { - "id" : "limit set 1", + "id" : "limit set 1_OR", "permanentLimit":700.4, - "temporaryLimits":[{"name":"IT5","acceptableDuration":300,"value":250.0}] + "temporaryLimits":[{"name":"IT5","acceptableDuration":300,"value":250.0}], + "applicability": null } ], "currentLimits2": [ { - "id" : "limit set 1", + "id" : "limit set 1_EX", "permanentLimit":800.8, - "temporaryLimits":[{"name":"IT20","acceptableDuration":1200,"value":300.0},{"name":"IT10","acceptableDuration":600,"value":200.0}] + "temporaryLimits":[{"name":"IT20","acceptableDuration":1200,"value":300.0},{"name":"IT10","acceptableDuration":600,"value":200.0}], + "applicability": null } ], - "selectedOperationalLimitsGroup1": "limit set 1", - "selectedOperationalLimitsGroup2": "limit set 1", + "currentLimits": [ + { + "id" : "limit set 1_OR", + "permanentLimit":700.4, + "temporaryLimits":[{"name":"IT5","acceptableDuration":300,"value":250.0}], + "applicability": "SIDE1" + }, + { + "id" : "limit set 1_EX", + "permanentLimit":800.8, + "temporaryLimits":[{"name":"IT20","acceptableDuration":1200,"value":300.0},{"name":"IT10","acceptableDuration":600,"value":200.0}], + "applicability": "SIDE2" + } + ], + "selectedOperationalLimitsGroup1": "limit set 1_OR", + "selectedOperationalLimitsGroup2": "limit set 1_EX", "r": 9.0, "x": 10.0, "g1": 7.0, diff --git a/src/test/resources/line-tooltip-data.json b/src/test/resources/line-tooltip-data.json index 052ea156..102481b9 100644 --- a/src/test/resources/line-tooltip-data.json +++ b/src/test/resources/line-tooltip-data.json @@ -8,14 +8,16 @@ "permanentLimit": 700.4, "temporaryLimits": [ { "name": "IT5", "value": 250.0, "acceptableDuration": 300 } - ] + ], + "applicability": null }, "currentLimits2": { "permanentLimit": 800.8, "temporaryLimits": [ { "name": "IT20", "value": 300.0, "acceptableDuration": 1200 }, { "name": "IT10", "value": 200.0, "acceptableDuration": 600 } - ] + ], + "applicability": null }, "r":9.0, "x":10.0, diff --git a/src/test/resources/lines-form-data.json b/src/test/resources/lines-form-data.json index ada58ab3..a5e451ac 100644 --- a/src/test/resources/lines-form-data.json +++ b/src/test/resources/lines-form-data.json @@ -11,7 +11,7 @@ "q2": 4.44, "currentLimits1": [ { - "id": "limit set 1", + "id": "limit set 1_OR", "permanentLimit": 700.4, "temporaryLimits": [ { @@ -19,12 +19,13 @@ "value": 250.0, "acceptableDuration": 300 } - ] + ], + "applicability": null } ], "currentLimits2": [ { - "id": "limit set 1", + "id": "limit set 1_EX", "permanentLimit": 800.8, "temporaryLimits": [ { @@ -37,11 +38,43 @@ "value": 200.0, "acceptableDuration": 600 } - ] + ], + "applicability": null } ], - "selectedOperationalLimitsGroup1": "limit set 1", - "selectedOperationalLimitsGroup2": "limit set 1", + "currentLimits": [ + { + "id": "limit set 1_OR", + "permanentLimit": 700.4, + "temporaryLimits": [ + { + "name": "IT5", + "value": 250.0, + "acceptableDuration": 300 + } + ], + "applicability": "SIDE1" + }, + { + "id": "limit set 1_EX", + "permanentLimit": 800.8, + "temporaryLimits": [ + { + "name": "IT20", + "value": 300.0, + "acceptableDuration": 1200 + }, + { + "name": "IT10", + "value": 200.0, + "acceptableDuration": 600 + } + ], + "applicability": "SIDE2" + } + ], + "selectedOperationalLimitsGroup1": "limit set 1_OR", + "selectedOperationalLimitsGroup2": "limit set 1_EX", "r": 9.0, "x": 10.0, "g1": 7.0, @@ -77,7 +110,8 @@ "value": 90.0, "acceptableDuration": 200 } - ] + ], + "applicability": null }, { "id": "group1", @@ -93,7 +127,8 @@ "value": 50.0, "acceptableDuration": 100 } - ] + ], + "applicability": null } ], "currentLimits2": [ @@ -106,7 +141,63 @@ "value": 130.0, "acceptableDuration": 200 } - ] + ], + "applicability": null + }, + { + "id": "group3", + "permanentLimit": 300.0, + "temporaryLimits": [ + { + "name": "temporary1", + "value": 110.0, + "acceptableDuration": 150 + } + ], + "applicability": null + } + ], + "currentLimits": [ + { + "id": "group2", + "permanentLimit": 250.0, + "temporaryLimits": [ + { + "name": "temporary1", + "value": 90.0, + "acceptableDuration": 200 + } + ], + "applicability": "SIDE1" + }, + { + "id": "group1", + "permanentLimit": 220.0, + "temporaryLimits": [ + { + "name": "temporary2", + "value": 70.0, + "acceptableDuration": 150 + }, + { + "name": "temporary1", + "value": 50.0, + "acceptableDuration": 100 + } + ], + "applicability": "SIDE1" + }, + { + "id": "group4", + "permanentLimit": 320.0, + "temporaryLimits": [ + { + "name": "temporary1", + "value": 130.0, + "acceptableDuration": 200 + } + ], + "applicability": "SIDE2" }, { "id": "group3", @@ -117,9 +208,11 @@ "value": 110.0, "acceptableDuration": 150 } - ] + ], + "applicability": "SIDE2" } ], + "selectedOperationalLimitsGroup1": "group1", "selectedOperationalLimitsGroup2": "group4", "r": 3.0, From 0caa8387d62b107e31291bae6f24bd28b7373d10 Mon Sep 17 00:00:00 2001 From: basseche Date: Fri, 18 Jul 2025 12:57:40 +0200 Subject: [PATCH 07/22] Update src/main/java/org/gridsuite/network/map/dto/common/CurrentLimitsData.java Co-authored-by: Mathieu Deharbe <148252167+Mathieu-Deharbe@users.noreply.github.com> --- .../org/gridsuite/network/map/dto/common/CurrentLimitsData.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/gridsuite/network/map/dto/common/CurrentLimitsData.java b/src/main/java/org/gridsuite/network/map/dto/common/CurrentLimitsData.java index 0a563eb7..4d3d5d3e 100644 --- a/src/main/java/org/gridsuite/network/map/dto/common/CurrentLimitsData.java +++ b/src/main/java/org/gridsuite/network/map/dto/common/CurrentLimitsData.java @@ -36,7 +36,7 @@ public class CurrentLimitsData { private Applicability applicability; public enum Applicability { - EQUIPMENT, + EQUIPMENT, // applied to both sides SIDE1, SIDE2, } From 79bf9adb3dd4fd5091f3ae4e4b07bc0a6750f74b Mon Sep 17 00:00:00 2001 From: basseche Date: Fri, 18 Jul 2025 12:58:22 +0200 Subject: [PATCH 08/22] Update src/main/java/org/gridsuite/network/map/dto/utils/ElementUtils.java Co-authored-by: Mathieu Deharbe <148252167+Mathieu-Deharbe@users.noreply.github.com> --- .../java/org/gridsuite/network/map/dto/utils/ElementUtils.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/org/gridsuite/network/map/dto/utils/ElementUtils.java b/src/main/java/org/gridsuite/network/map/dto/utils/ElementUtils.java index c2f4b094..3da57d9a 100644 --- a/src/main/java/org/gridsuite/network/map/dto/utils/ElementUtils.java +++ b/src/main/java/org/gridsuite/network/map/dto/utils/ElementUtils.java @@ -146,6 +146,9 @@ private static CurrentLimitsData copyCurrentLimitsData(CurrentLimitsData current .permanentLimit(currentLimitsData.getPermanentLimit()).build(); } + /** + * @return id of the selected operation limits group 1 and 2 if they have been renamed + */ public static Pair mergeCurrentLimits(Collection operationalLimitsGroups1, Collection operationalLimitsGroups2, String selectedLimitsGroup1, String selectedLimitsGroup2, From 24aff7bfba19230968b73974b07b411e7372f78b Mon Sep 17 00:00:00 2001 From: basseche Date: Fri, 18 Jul 2025 12:58:54 +0200 Subject: [PATCH 09/22] Update src/main/java/org/gridsuite/network/map/dto/utils/ElementUtils.java Co-authored-by: Mathieu Deharbe <148252167+Mathieu-Deharbe@users.noreply.github.com> --- .../java/org/gridsuite/network/map/dto/utils/ElementUtils.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/org/gridsuite/network/map/dto/utils/ElementUtils.java b/src/main/java/org/gridsuite/network/map/dto/utils/ElementUtils.java index 3da57d9a..fd8ed816 100644 --- a/src/main/java/org/gridsuite/network/map/dto/utils/ElementUtils.java +++ b/src/main/java/org/gridsuite/network/map/dto/utils/ElementUtils.java @@ -142,6 +142,7 @@ private static CurrentLimitsData copyCurrentLimitsData(CurrentLimitsData current private static CurrentLimitsData copyCurrentLimitsData(CurrentLimitsData currentLimitsData, String id) { return CurrentLimitsData.builder() .id(id.isEmpty() ? currentLimitsData.getId() : id) + .applicability(currentLimitsData.getApplicability()) .temporaryLimits(currentLimitsData.getTemporaryLimits()) .permanentLimit(currentLimitsData.getPermanentLimit()).build(); } From 42d5f09f48b7382572ec8111a01a580c5d61915e Mon Sep 17 00:00:00 2001 From: basseche Date: Fri, 18 Jul 2025 16:16:24 +0200 Subject: [PATCH 10/22] --Change Specs : No id change for CurrentLimitsData when limits are different Signed-off-by: basseche --- .../map/dto/mapper/LineInfosMapper.java | 16 ++-- .../TwoWindingsTransformerInfosMapper.java | 14 ++-- .../network/map/dto/utils/ElementUtils.java | 79 +++---------------- 3 files changed, 20 insertions(+), 89 deletions(-) diff --git a/src/main/java/org/gridsuite/network/map/dto/mapper/LineInfosMapper.java b/src/main/java/org/gridsuite/network/map/dto/mapper/LineInfosMapper.java index b5880b3f..e7972b19 100644 --- a/src/main/java/org/gridsuite/network/map/dto/mapper/LineInfosMapper.java +++ b/src/main/java/org/gridsuite/network/map/dto/mapper/LineInfosMapper.java @@ -66,18 +66,14 @@ private static LineFormInfos toFormInfos(Identifiable identifiable) { .b1(line.getB1()) .g2(line.getG2()) .b2(line.getB2()) - .properties(getProperties(line)); - - Pair newSelectedOpLimitsGroups = mergeCurrentLimits(line.getOperationalLimitsGroups1(), line.getOperationalLimitsGroups2(), - line.getSelectedOperationalLimitsGroupId1().orElse(null), - line.getSelectedOperationalLimitsGroupId2().orElse(null), - builder::currentLimits); + .properties(getProperties(line)) + .selectedOperationalLimitsGroup1(line.getSelectedOperationalLimitsGroupId1().orElse(null)) + .selectedOperationalLimitsGroup2(line.getSelectedOperationalLimitsGroupId2().orElse(null)); - builder.selectedOperationalLimitsGroup1(!newSelectedOpLimitsGroups.getLeft().isEmpty() ? newSelectedOpLimitsGroups.getLeft() : line.getSelectedOperationalLimitsGroupId1().orElse(null)); - builder.selectedOperationalLimitsGroup2(!newSelectedOpLimitsGroups.getRight().isEmpty() ? newSelectedOpLimitsGroups.getRight() : line.getSelectedOperationalLimitsGroupId2().orElse(null)); + mergeCurrentLimits(line.getOperationalLimitsGroups1(), line.getOperationalLimitsGroups2(), builder::currentLimits); - buildCurrentLimits(line.getOperationalLimitsGroups1(), line.getSelectedOperationalLimitsGroupId1().orElse(null), newSelectedOpLimitsGroups.getLeft(), builder::currentLimits1); - buildCurrentLimits(line.getOperationalLimitsGroups2(), line.getSelectedOperationalLimitsGroupId2().orElse(null), newSelectedOpLimitsGroups.getRight(), builder::currentLimits2); + buildCurrentLimits(line.getOperationalLimitsGroups1(), builder::currentLimits1); + buildCurrentLimits(line.getOperationalLimitsGroups2(), builder::currentLimits2); builder.busOrBusbarSectionId1(getBusOrBusbarSection(terminal1)) .busOrBusbarSectionId2(getBusOrBusbarSection(terminal2)); diff --git a/src/main/java/org/gridsuite/network/map/dto/mapper/TwoWindingsTransformerInfosMapper.java b/src/main/java/org/gridsuite/network/map/dto/mapper/TwoWindingsTransformerInfosMapper.java index 1b7ac171..7df191fd 100644 --- a/src/main/java/org/gridsuite/network/map/dto/mapper/TwoWindingsTransformerInfosMapper.java +++ b/src/main/java/org/gridsuite/network/map/dto/mapper/TwoWindingsTransformerInfosMapper.java @@ -78,17 +78,13 @@ private static TwoWindingsTransformerFormInfos toFormInfos(Identifiable ident builder.q2(nullIfNan(terminal2.getQ())); builder.i1(nullIfNan(terminal1.getI())); builder.i2(nullIfNan(terminal2.getI())); + builder.selectedOperationalLimitsGroup1(twoWT.getSelectedOperationalLimitsGroupId1().orElse(null)); + builder.selectedOperationalLimitsGroup2(twoWT.getSelectedOperationalLimitsGroupId2().orElse(null)); - Pair newSelectedOpLimitsGroups = mergeCurrentLimits(twoWT.getOperationalLimitsGroups1(), twoWT.getOperationalLimitsGroups2(), - twoWT.getSelectedOperationalLimitsGroupId1().orElse(null), - twoWT.getSelectedOperationalLimitsGroupId2().orElse(null), - builder::currentLimits); - - builder.selectedOperationalLimitsGroup1(!newSelectedOpLimitsGroups.getLeft().isEmpty() ? newSelectedOpLimitsGroups.getLeft() : twoWT.getSelectedOperationalLimitsGroupId1().orElse(null)); - builder.selectedOperationalLimitsGroup2(!newSelectedOpLimitsGroups.getRight().isEmpty() ? newSelectedOpLimitsGroups.getRight() : twoWT.getSelectedOperationalLimitsGroupId2().orElse(null)); + mergeCurrentLimits(twoWT.getOperationalLimitsGroups1(), twoWT.getOperationalLimitsGroups2(), builder::currentLimits); - buildCurrentLimits(twoWT.getOperationalLimitsGroups1(), twoWT.getSelectedOperationalLimitsGroupId1().orElse(null), newSelectedOpLimitsGroups.getLeft(), builder::currentLimits1); - buildCurrentLimits(twoWT.getOperationalLimitsGroups2(), twoWT.getSelectedOperationalLimitsGroupId2().orElse(null), newSelectedOpLimitsGroups.getRight(), builder::currentLimits2); + buildCurrentLimits(twoWT.getOperationalLimitsGroups1(), builder::currentLimits1); + buildCurrentLimits(twoWT.getOperationalLimitsGroups2(), builder::currentLimits2); builder.operatingStatus(toOperatingStatus(twoWT)); builder.connectablePosition1(toMapConnectablePosition(twoWT, 1)) diff --git a/src/main/java/org/gridsuite/network/map/dto/utils/ElementUtils.java b/src/main/java/org/gridsuite/network/map/dto/utils/ElementUtils.java index fd8ed816..37fd845b 100644 --- a/src/main/java/org/gridsuite/network/map/dto/utils/ElementUtils.java +++ b/src/main/java/org/gridsuite/network/map/dto/utils/ElementUtils.java @@ -85,64 +85,21 @@ public static Optional toHvdcOperatorActivePo .oprFromCS2toCS1(hvdcOperatorActivePowerRange.getOprFromCS2toCS1()).build()); } - public static void buildCurrentLimits(Collection currentLimits, String oldSelected, String newSelected, Consumer> build) { + public static void buildCurrentLimits(Collection currentLimits, Consumer> build) { ArrayList currentLimitsData = new ArrayList<>(currentLimits.stream() .map(ElementUtils::operationalLimitsGroupToMapDataCurrentLimits) .toList()); - // if selected operationalLimitsGroups renamed, rename it also here - if (!newSelected.isEmpty()) { - Optional limitsGroup = currentLimitsData.stream().filter(l -> l.getId().equals(oldSelected)).findFirst(); - if (limitsGroup.isPresent()) { - CurrentLimitsData current = copyCurrentLimitsData(limitsGroup.get(), newSelected); - currentLimitsData.remove(limitsGroup.get()); - currentLimitsData.add(current); - } - } - if (!currentLimitsData.isEmpty()) { build.accept(currentLimitsData); } } - private static String generateSetName(String basicName, String suffix, List mergedList, List otherList) { - - boolean nameUsed; - String strIncrement = ""; - int increment = 1; - - do { - String currentId = basicName + suffix + strIncrement; - if (!mergedList.stream().filter(l -> l.getId().equals(currentId)).toList().isEmpty() - || !otherList.stream().filter(l -> l.getId().equals(currentId)).toList().isEmpty()) { - nameUsed = true; - increment++; - strIncrement = "(" + increment + ")"; - } else { - nameUsed = false; - } - } while (nameUsed); - - return basicName + suffix + strIncrement; - } - - private static CurrentLimitsData copyCurrentLimitsData(CurrentLimitsData currentLimitsData, CurrentLimitsData.Applicability applicability, String id) { - return CurrentLimitsData.builder() - .id(id.isEmpty() ? currentLimitsData.getId() : id) - .applicability(applicability) - .temporaryLimits(currentLimitsData.getTemporaryLimits()) - .permanentLimit(currentLimitsData.getPermanentLimit()).build(); - } - private static CurrentLimitsData copyCurrentLimitsData(CurrentLimitsData currentLimitsData, CurrentLimitsData.Applicability applicability) { - return copyCurrentLimitsData(currentLimitsData, applicability, ""); - } - - private static CurrentLimitsData copyCurrentLimitsData(CurrentLimitsData currentLimitsData, String id) { return CurrentLimitsData.builder() - .id(id.isEmpty() ? currentLimitsData.getId() : id) - .applicability(currentLimitsData.getApplicability()) + .id(currentLimitsData.getId()) + .applicability(applicability) .temporaryLimits(currentLimitsData.getTemporaryLimits()) .permanentLimit(currentLimitsData.getPermanentLimit()).build(); } @@ -150,14 +107,9 @@ private static CurrentLimitsData copyCurrentLimitsData(CurrentLimitsData current /** * @return id of the selected operation limits group 1 and 2 if they have been renamed */ - public static Pair mergeCurrentLimits(Collection operationalLimitsGroups1, + public static void mergeCurrentLimits(Collection operationalLimitsGroups1, Collection operationalLimitsGroups2, - String selectedLimitsGroup1, String selectedLimitsGroup2, Consumer> build) { - final String orSuffix = "_OR"; - final String exSuffix = "_EX"; - String changedSelectedLimitsGroup1 = ""; - String changedSelectedLimitsGroup2 = ""; List mergedLimitsData = new ArrayList<>(); // Build temporary limit from side 1 and 2 @@ -174,13 +126,13 @@ public static Pair mergeCurrentLimits(Collection mergeCurrentLimits(Collection mergeCurrentLimits(Collection toStandbyAutomaton(StaticVarCompensator staticVarCompensator) { From b237412dc5ee66b01c94d35b2dd494dabf439f01 Mon Sep 17 00:00:00 2001 From: Mathieu DEHARBE Date: Wed, 23 Jul 2025 14:43:49 +0200 Subject: [PATCH 11/22] corrects TU and imports Signed-off-by: Mathieu DEHARBE --- .../network/map/dto/mapper/LineInfosMapper.java | 1 - .../mapper/TwoWindingsTransformerInfosMapper.java | 1 - .../network/map/dto/utils/ElementUtils.java | 3 +-- .../resources/2-windings-transformer-map-data.json | 12 ++++++------ src/test/resources/line-form-data.json | 12 ++++++------ src/test/resources/lines-form-data.json | 12 ++++++------ 6 files changed, 19 insertions(+), 22 deletions(-) diff --git a/src/main/java/org/gridsuite/network/map/dto/mapper/LineInfosMapper.java b/src/main/java/org/gridsuite/network/map/dto/mapper/LineInfosMapper.java index e7972b19..b661276f 100644 --- a/src/main/java/org/gridsuite/network/map/dto/mapper/LineInfosMapper.java +++ b/src/main/java/org/gridsuite/network/map/dto/mapper/LineInfosMapper.java @@ -8,7 +8,6 @@ import com.powsybl.iidm.network.*; import com.powsybl.iidm.network.extensions.Measurement; -import org.apache.commons.lang3.tuple.Pair; import org.gridsuite.network.map.dto.ElementInfos; import org.gridsuite.network.map.dto.InfoTypeParameters; import org.gridsuite.network.map.dto.common.CurrentLimitsData; diff --git a/src/main/java/org/gridsuite/network/map/dto/mapper/TwoWindingsTransformerInfosMapper.java b/src/main/java/org/gridsuite/network/map/dto/mapper/TwoWindingsTransformerInfosMapper.java index 7df191fd..870beffb 100644 --- a/src/main/java/org/gridsuite/network/map/dto/mapper/TwoWindingsTransformerInfosMapper.java +++ b/src/main/java/org/gridsuite/network/map/dto/mapper/TwoWindingsTransformerInfosMapper.java @@ -10,7 +10,6 @@ import com.powsybl.iidm.network.extensions.DiscreteMeasurement; import com.powsybl.iidm.network.extensions.Measurement; import com.powsybl.iidm.network.extensions.TwoWindingsTransformerToBeEstimated; -import org.apache.commons.lang3.tuple.Pair; import org.gridsuite.network.map.dto.ElementInfos; import org.gridsuite.network.map.dto.InfoTypeParameters; import org.gridsuite.network.map.dto.common.CurrentLimitsData; diff --git a/src/main/java/org/gridsuite/network/map/dto/utils/ElementUtils.java b/src/main/java/org/gridsuite/network/map/dto/utils/ElementUtils.java index 37fd845b..1c0d609e 100644 --- a/src/main/java/org/gridsuite/network/map/dto/utils/ElementUtils.java +++ b/src/main/java/org/gridsuite/network/map/dto/utils/ElementUtils.java @@ -10,7 +10,6 @@ import com.powsybl.iidm.network.*; import com.powsybl.iidm.network.extensions.*; import com.powsybl.math.graph.TraversalType; -import org.apache.commons.lang3.tuple.Pair; import org.gridsuite.network.map.dto.common.*; import org.gridsuite.network.map.dto.definition.extension.*; import org.gridsuite.network.map.dto.definition.threewindingstransformer.ThreeWindingsTransformerTabInfos; @@ -151,7 +150,7 @@ public static void mergeCurrentLimits(Collection operati // both sides have limits and limits are equals if (limitsData.limitsEquals(limitsData2)) { mergedLimitsData.add(copyCurrentLimitsData(limitsData, EQUIPMENT)); - // both side have limits and they are different : create 2 different limit sets with basename_Or and _Ex + // both side have limits and they are different : create 2 different limit sets } else { // Side 1 mergedLimitsData.add(copyCurrentLimitsData(limitsData, SIDE1)); diff --git a/src/test/resources/2-windings-transformer-map-data.json b/src/test/resources/2-windings-transformer-map-data.json index ac97a5d8..c9c68f2b 100644 --- a/src/test/resources/2-windings-transformer-map-data.json +++ b/src/test/resources/2-windings-transformer-map-data.json @@ -13,7 +13,7 @@ "q2": 14.44, "currentLimits1": [ { - "id" : "limit set 1_OR", + "id" : "limit set 1", "permanentLimit":750.4, "temporaryLimits":[{"name":"IT5","acceptableDuration":2087,"value":300}], "applicability": null @@ -21,7 +21,7 @@ ], "currentLimits2": [ { - "id" : "limit set 1_EX", + "id" : "limit set 1", "permanentLimit":780.6, "temporaryLimits":[{"name":"N/A","acceptableDuration":664,"value":2147483647},{"name":"IT20","acceptableDuration":961,"value":1200}], "applicability": null @@ -29,20 +29,20 @@ ], "currentLimits": [ { - "id" : "limit set 1_OR", + "id" : "limit set 1", "permanentLimit":750.4, "temporaryLimits":[{"name":"IT5","acceptableDuration":2087,"value":300}], "applicability": "SIDE1" }, { - "id" : "limit set 1_EX", + "id" : "limit set 1", "permanentLimit":780.6, "temporaryLimits":[{"name":"N/A","acceptableDuration":664,"value":2147483647},{"name":"IT20","acceptableDuration":961,"value":1200}], "applicability": "SIDE2" } ], - "selectedOperationalLimitsGroup1": "limit set 1_OR", - "selectedOperationalLimitsGroup2": "limit set 1_EX", + "selectedOperationalLimitsGroup1": "limit set 1", + "selectedOperationalLimitsGroup2": "limit set 1", "phaseTapChanger": { "lowTapPosition": 0, "highTapPosition": 1, diff --git a/src/test/resources/line-form-data.json b/src/test/resources/line-form-data.json index a09ad28b..bf2c16ef 100644 --- a/src/test/resources/line-form-data.json +++ b/src/test/resources/line-form-data.json @@ -10,7 +10,7 @@ "q2": 4.44, "currentLimits1": [ { - "id" : "limit set 1_OR", + "id" : "limit set 1", "permanentLimit":700.4, "temporaryLimits":[{"name":"IT5","acceptableDuration":300,"value":250.0}], "applicability": null @@ -18,7 +18,7 @@ ], "currentLimits2": [ { - "id" : "limit set 1_EX", + "id" : "limit set 1", "permanentLimit":800.8, "temporaryLimits":[{"name":"IT20","acceptableDuration":1200,"value":300.0},{"name":"IT10","acceptableDuration":600,"value":200.0}], "applicability": null @@ -26,20 +26,20 @@ ], "currentLimits": [ { - "id" : "limit set 1_OR", + "id" : "limit set 1", "permanentLimit":700.4, "temporaryLimits":[{"name":"IT5","acceptableDuration":300,"value":250.0}], "applicability": "SIDE1" }, { - "id" : "limit set 1_EX", + "id" : "limit set 1", "permanentLimit":800.8, "temporaryLimits":[{"name":"IT20","acceptableDuration":1200,"value":300.0},{"name":"IT10","acceptableDuration":600,"value":200.0}], "applicability": "SIDE2" } ], - "selectedOperationalLimitsGroup1": "limit set 1_OR", - "selectedOperationalLimitsGroup2": "limit set 1_EX", + "selectedOperationalLimitsGroup1": "limit set 1", + "selectedOperationalLimitsGroup2": "limit set 1", "r": 9.0, "x": 10.0, "g1": 7.0, diff --git a/src/test/resources/lines-form-data.json b/src/test/resources/lines-form-data.json index a5e451ac..cc8f85f1 100644 --- a/src/test/resources/lines-form-data.json +++ b/src/test/resources/lines-form-data.json @@ -11,7 +11,7 @@ "q2": 4.44, "currentLimits1": [ { - "id": "limit set 1_OR", + "id": "limit set 1", "permanentLimit": 700.4, "temporaryLimits": [ { @@ -25,7 +25,7 @@ ], "currentLimits2": [ { - "id": "limit set 1_EX", + "id": "limit set 1", "permanentLimit": 800.8, "temporaryLimits": [ { @@ -44,7 +44,7 @@ ], "currentLimits": [ { - "id": "limit set 1_OR", + "id": "limit set 1", "permanentLimit": 700.4, "temporaryLimits": [ { @@ -56,7 +56,7 @@ "applicability": "SIDE1" }, { - "id": "limit set 1_EX", + "id": "limit set 1", "permanentLimit": 800.8, "temporaryLimits": [ { @@ -73,8 +73,8 @@ "applicability": "SIDE2" } ], - "selectedOperationalLimitsGroup1": "limit set 1_OR", - "selectedOperationalLimitsGroup2": "limit set 1_EX", + "selectedOperationalLimitsGroup1": "limit set 1", + "selectedOperationalLimitsGroup2": "limit set 1", "r": 9.0, "x": 10.0, "g1": 7.0, From 11a96f95953771bb5b9413048ddcc0c72124ae29 Mon Sep 17 00:00:00 2001 From: Mathieu DEHARBE Date: Mon, 28 Jul 2025 15:55:59 +0200 Subject: [PATCH 12/22] removes currentLimits1 and currentLimits2 Signed-off-by: Mathieu DEHARBE --- .../network/map/dto/definition/line/LineFormInfos.java | 6 ------ .../gridsuite/network/map/dto/mapper/LineInfosMapper.java | 3 --- 2 files changed, 9 deletions(-) diff --git a/src/main/java/org/gridsuite/network/map/dto/definition/line/LineFormInfos.java b/src/main/java/org/gridsuite/network/map/dto/definition/line/LineFormInfos.java index cd169b0e..4790acf0 100644 --- a/src/main/java/org/gridsuite/network/map/dto/definition/line/LineFormInfos.java +++ b/src/main/java/org/gridsuite/network/map/dto/definition/line/LineFormInfos.java @@ -58,12 +58,6 @@ public class LineFormInfos extends ElementInfosWithProperties { @JsonInclude(JsonInclude.Include.NON_EMPTY) private List currentLimits; - @JsonInclude(JsonInclude.Include.NON_EMPTY) - private List currentLimits1; - - @JsonInclude(JsonInclude.Include.NON_EMPTY) - private List currentLimits2; - @JsonInclude(JsonInclude.Include.NON_NULL) private String selectedOperationalLimitsGroup1; diff --git a/src/main/java/org/gridsuite/network/map/dto/mapper/LineInfosMapper.java b/src/main/java/org/gridsuite/network/map/dto/mapper/LineInfosMapper.java index b661276f..5e83013b 100644 --- a/src/main/java/org/gridsuite/network/map/dto/mapper/LineInfosMapper.java +++ b/src/main/java/org/gridsuite/network/map/dto/mapper/LineInfosMapper.java @@ -71,9 +71,6 @@ private static LineFormInfos toFormInfos(Identifiable identifiable) { mergeCurrentLimits(line.getOperationalLimitsGroups1(), line.getOperationalLimitsGroups2(), builder::currentLimits); - buildCurrentLimits(line.getOperationalLimitsGroups1(), builder::currentLimits1); - buildCurrentLimits(line.getOperationalLimitsGroups2(), builder::currentLimits2); - builder.busOrBusbarSectionId1(getBusOrBusbarSection(terminal1)) .busOrBusbarSectionId2(getBusOrBusbarSection(terminal2)); From dc09d65196a7bbc70a4304e97c023a2c40acfc4f Mon Sep 17 00:00:00 2001 From: Mathieu DEHARBE Date: Mon, 28 Jul 2025 16:14:15 +0200 Subject: [PATCH 13/22] removes currentLimits1 and currentLimits2 for transfos + TU Signed-off-by: Mathieu DEHARBE --- .../TwoWindingsTransformerFormInfos.java | 7 -- .../TwoWindingsTransformerInfosMapper.java | 3 - .../2-windings-transformer-map-data.json | 16 ---- src/test/resources/line-form-data.json | 16 ---- src/test/resources/lines-form-data.json | 90 ------------------- 5 files changed, 132 deletions(-) diff --git a/src/main/java/org/gridsuite/network/map/dto/definition/twowindingstransformer/TwoWindingsTransformerFormInfos.java b/src/main/java/org/gridsuite/network/map/dto/definition/twowindingstransformer/TwoWindingsTransformerFormInfos.java index 12606678..0a456270 100644 --- a/src/main/java/org/gridsuite/network/map/dto/definition/twowindingstransformer/TwoWindingsTransformerFormInfos.java +++ b/src/main/java/org/gridsuite/network/map/dto/definition/twowindingstransformer/TwoWindingsTransformerFormInfos.java @@ -57,13 +57,6 @@ public class TwoWindingsTransformerFormInfos extends ElementInfosWithProperties @JsonInclude(JsonInclude.Include.NON_NULL) private Double i2; - // TODO : remove currentLimits1 and 2 to leave only currentLimits when modification is done - @JsonInclude(JsonInclude.Include.NON_EMPTY) - private List currentLimits1; - - @JsonInclude(JsonInclude.Include.NON_EMPTY) - private List currentLimits2; - @JsonInclude(JsonInclude.Include.NON_EMPTY) private List currentLimits; diff --git a/src/main/java/org/gridsuite/network/map/dto/mapper/TwoWindingsTransformerInfosMapper.java b/src/main/java/org/gridsuite/network/map/dto/mapper/TwoWindingsTransformerInfosMapper.java index 870beffb..af2f685d 100644 --- a/src/main/java/org/gridsuite/network/map/dto/mapper/TwoWindingsTransformerInfosMapper.java +++ b/src/main/java/org/gridsuite/network/map/dto/mapper/TwoWindingsTransformerInfosMapper.java @@ -82,9 +82,6 @@ private static TwoWindingsTransformerFormInfos toFormInfos(Identifiable ident mergeCurrentLimits(twoWT.getOperationalLimitsGroups1(), twoWT.getOperationalLimitsGroups2(), builder::currentLimits); - buildCurrentLimits(twoWT.getOperationalLimitsGroups1(), builder::currentLimits1); - buildCurrentLimits(twoWT.getOperationalLimitsGroups2(), builder::currentLimits2); - builder.operatingStatus(toOperatingStatus(twoWT)); builder.connectablePosition1(toMapConnectablePosition(twoWT, 1)) .connectablePosition2(toMapConnectablePosition(twoWT, 2)); diff --git a/src/test/resources/2-windings-transformer-map-data.json b/src/test/resources/2-windings-transformer-map-data.json index c9c68f2b..98e4a905 100644 --- a/src/test/resources/2-windings-transformer-map-data.json +++ b/src/test/resources/2-windings-transformer-map-data.json @@ -11,22 +11,6 @@ "q1": 12.2, "p2": 13.33, "q2": 14.44, - "currentLimits1": [ - { - "id" : "limit set 1", - "permanentLimit":750.4, - "temporaryLimits":[{"name":"IT5","acceptableDuration":2087,"value":300}], - "applicability": null - } - ], - "currentLimits2": [ - { - "id" : "limit set 1", - "permanentLimit":780.6, - "temporaryLimits":[{"name":"N/A","acceptableDuration":664,"value":2147483647},{"name":"IT20","acceptableDuration":961,"value":1200}], - "applicability": null - } - ], "currentLimits": [ { "id" : "limit set 1", diff --git a/src/test/resources/line-form-data.json b/src/test/resources/line-form-data.json index bf2c16ef..624c3132 100644 --- a/src/test/resources/line-form-data.json +++ b/src/test/resources/line-form-data.json @@ -8,22 +8,6 @@ "q1": 2.2, "p2": 3.33, "q2": 4.44, - "currentLimits1": [ - { - "id" : "limit set 1", - "permanentLimit":700.4, - "temporaryLimits":[{"name":"IT5","acceptableDuration":300,"value":250.0}], - "applicability": null - } - ], - "currentLimits2": [ - { - "id" : "limit set 1", - "permanentLimit":800.8, - "temporaryLimits":[{"name":"IT20","acceptableDuration":1200,"value":300.0},{"name":"IT10","acceptableDuration":600,"value":200.0}], - "applicability": null - } - ], "currentLimits": [ { "id" : "limit set 1", diff --git a/src/test/resources/lines-form-data.json b/src/test/resources/lines-form-data.json index cc8f85f1..6a6837db 100644 --- a/src/test/resources/lines-form-data.json +++ b/src/test/resources/lines-form-data.json @@ -9,39 +9,6 @@ "q1": 2.2, "p2": 3.33, "q2": 4.44, - "currentLimits1": [ - { - "id": "limit set 1", - "permanentLimit": 700.4, - "temporaryLimits": [ - { - "name": "IT5", - "value": 250.0, - "acceptableDuration": 300 - } - ], - "applicability": null - } - ], - "currentLimits2": [ - { - "id": "limit set 1", - "permanentLimit": 800.8, - "temporaryLimits": [ - { - "name": "IT20", - "value": 300.0, - "acceptableDuration": 1200 - }, - { - "name": "IT10", - "value": 200.0, - "acceptableDuration": 600 - } - ], - "applicability": null - } - ], "currentLimits": [ { "id": "limit set 1", @@ -100,63 +67,6 @@ "voltageLevelId2": "VLHV2", "terminal1Connected": true, "terminal2Connected": true, - "currentLimits1": [ - { - "id": "group2", - "permanentLimit": 250.0, - "temporaryLimits": [ - { - "name": "temporary1", - "value": 90.0, - "acceptableDuration": 200 - } - ], - "applicability": null - }, - { - "id": "group1", - "permanentLimit": 220.0, - "temporaryLimits": [ - { - "name": "temporary2", - "value": 70.0, - "acceptableDuration": 150 - }, - { - "name": "temporary1", - "value": 50.0, - "acceptableDuration": 100 - } - ], - "applicability": null - } - ], - "currentLimits2": [ - { - "id": "group4", - "permanentLimit": 320.0, - "temporaryLimits": [ - { - "name": "temporary1", - "value": 130.0, - "acceptableDuration": 200 - } - ], - "applicability": null - }, - { - "id": "group3", - "permanentLimit": 300.0, - "temporaryLimits": [ - { - "name": "temporary1", - "value": 110.0, - "acceptableDuration": 150 - } - ], - "applicability": null - } - ], "currentLimits": [ { "id": "group2", From b444cf0beeeca5a3561fd9a0f175833df5169c9f Mon Sep 17 00:00:00 2001 From: basseche Date: Tue, 29 Jul 2025 15:32:10 +0200 Subject: [PATCH 14/22] review Signed-off-by: basseche --- .../network/map/dto/definition/line/LineFormInfos.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/org/gridsuite/network/map/dto/definition/line/LineFormInfos.java b/src/main/java/org/gridsuite/network/map/dto/definition/line/LineFormInfos.java index cd169b0e..633773a8 100644 --- a/src/main/java/org/gridsuite/network/map/dto/definition/line/LineFormInfos.java +++ b/src/main/java/org/gridsuite/network/map/dto/definition/line/LineFormInfos.java @@ -58,9 +58,11 @@ public class LineFormInfos extends ElementInfosWithProperties { @JsonInclude(JsonInclude.Include.NON_EMPTY) private List currentLimits; + //TODO : remove when modification is done @JsonInclude(JsonInclude.Include.NON_EMPTY) private List currentLimits1; + //TODO : remove when modification is done @JsonInclude(JsonInclude.Include.NON_EMPTY) private List currentLimits2; From a59382064896b81623aa9c0afe1656fc87655cd6 Mon Sep 17 00:00:00 2001 From: basseche Date: Tue, 29 Jul 2025 15:36:32 +0200 Subject: [PATCH 15/22] Update src/main/java/org/gridsuite/network/map/dto/utils/ElementUtils.java Co-authored-by: Mathieu Deharbe <148252167+Mathieu-Deharbe@users.noreply.github.com> --- .../java/org/gridsuite/network/map/dto/utils/ElementUtils.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/gridsuite/network/map/dto/utils/ElementUtils.java b/src/main/java/org/gridsuite/network/map/dto/utils/ElementUtils.java index 1c0d609e..903666a2 100644 --- a/src/main/java/org/gridsuite/network/map/dto/utils/ElementUtils.java +++ b/src/main/java/org/gridsuite/network/map/dto/utils/ElementUtils.java @@ -126,7 +126,8 @@ public static void mergeCurrentLimits(Collection operati } build.accept(mergedLimitsData); return; - } else if (currentLimitsData1.isEmpty() && !currentLimitsData2.isEmpty()) { + } + if (currentLimitsData1.isEmpty() && !currentLimitsData2.isEmpty()) { for (CurrentLimitsData currentLimitsData : currentLimitsData2) { mergedLimitsData.add(copyCurrentLimitsData(currentLimitsData, SIDE2)); } From bc6333770c5b8fd870acbe26207f1cc566acaa49 Mon Sep 17 00:00:00 2001 From: basseche Date: Wed, 30 Jul 2025 12:43:11 +0200 Subject: [PATCH 16/22] checkstyle Signed-off-by: basseche --- .../java/org/gridsuite/network/map/dto/utils/ElementUtils.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/gridsuite/network/map/dto/utils/ElementUtils.java b/src/main/java/org/gridsuite/network/map/dto/utils/ElementUtils.java index 903666a2..638a1917 100644 --- a/src/main/java/org/gridsuite/network/map/dto/utils/ElementUtils.java +++ b/src/main/java/org/gridsuite/network/map/dto/utils/ElementUtils.java @@ -126,7 +126,7 @@ public static void mergeCurrentLimits(Collection operati } build.accept(mergedLimitsData); return; - } + } if (currentLimitsData1.isEmpty() && !currentLimitsData2.isEmpty()) { for (CurrentLimitsData currentLimitsData : currentLimitsData2) { mergedLimitsData.add(copyCurrentLimitsData(currentLimitsData, SIDE2)); From ebd2e5f410f795cdb2a751dff5f1c9aecb003435 Mon Sep 17 00:00:00 2001 From: basseche Date: Wed, 30 Jul 2025 17:05:00 +0200 Subject: [PATCH 17/22] change limit compare function Signed-off-by: basseche --- .../gridsuite/network/map/dto/common/CurrentLimitsData.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/gridsuite/network/map/dto/common/CurrentLimitsData.java b/src/main/java/org/gridsuite/network/map/dto/common/CurrentLimitsData.java index 4d3d5d3e..e7d5e5da 100644 --- a/src/main/java/org/gridsuite/network/map/dto/common/CurrentLimitsData.java +++ b/src/main/java/org/gridsuite/network/map/dto/common/CurrentLimitsData.java @@ -13,6 +13,7 @@ import org.springframework.util.CollectionUtils; import java.util.List; +import java.util.Objects; /** * @author David Braquart @@ -46,9 +47,8 @@ public boolean hasLimits() { } public boolean limitsEquals(CurrentLimitsData other) { - return permanentLimit != null && permanentLimit.equals(other.permanentLimit) - && (temporaryLimits != null && temporaryLimits.equals(other.temporaryLimits) - || temporaryLimits == null && other.temporaryLimits == null); + return Objects.equals(permanentLimit, other.permanentLimit) + && Objects.equals(temporaryLimits, other.temporaryLimits); } } From f3ae778922408d5f21d2a8448398163ff903cf93 Mon Sep 17 00:00:00 2001 From: basseche Date: Wed, 30 Jul 2025 17:08:37 +0200 Subject: [PATCH 18/22] revert changes on buildCurrentsLimits --- .../org/gridsuite/network/map/dto/utils/ElementUtils.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/gridsuite/network/map/dto/utils/ElementUtils.java b/src/main/java/org/gridsuite/network/map/dto/utils/ElementUtils.java index 638a1917..0bcdae1d 100644 --- a/src/main/java/org/gridsuite/network/map/dto/utils/ElementUtils.java +++ b/src/main/java/org/gridsuite/network/map/dto/utils/ElementUtils.java @@ -85,11 +85,9 @@ public static Optional toHvdcOperatorActivePo } public static void buildCurrentLimits(Collection currentLimits, Consumer> build) { - - ArrayList currentLimitsData = new ArrayList<>(currentLimits.stream() + List currentLimitsData = currentLimits.stream() .map(ElementUtils::operationalLimitsGroupToMapDataCurrentLimits) - .toList()); - + .toList(); if (!currentLimitsData.isEmpty()) { build.accept(currentLimitsData); } From b8624eec8131bc745768fee4fe86309181c68099 Mon Sep 17 00:00:00 2001 From: basseche Date: Thu, 31 Jul 2025 15:07:58 +0200 Subject: [PATCH 19/22] increase test coverage --- .../network/map/NetworkMapControllerTest.java | 17 ++++++++ src/test/resources/all-data-in-variant.json | 20 ++++++++++ src/test/resources/all-data.json | 20 ++++++++++ src/test/resources/line-tooltip-data-dc.json | 14 +++++++ src/test/resources/lines-form-data.json | 39 +++++++++++++++++++ .../partial-all-data-in-variant.json | 20 ++++++++++ src/test/resources/partial-all-data.json | 20 ++++++++++ ...rtial-all-map-data-no-redundant-lines.json | 20 ++++++++++ .../resources/partial-lines-form-data.json | 39 +++++++++++++++++++ 9 files changed, 209 insertions(+) diff --git a/src/test/java/org/gridsuite/network/map/NetworkMapControllerTest.java b/src/test/java/org/gridsuite/network/map/NetworkMapControllerTest.java index 3288e413..d722847a 100644 --- a/src/test/java/org/gridsuite/network/map/NetworkMapControllerTest.java +++ b/src/test/java/org/gridsuite/network/map/NetworkMapControllerTest.java @@ -485,6 +485,23 @@ void setUp() { .withObservable(true) .add(); + line3.newOperationalLimitsGroup1("group1").newCurrentLimits() + .setPermanentLimit(220.0) + .beginTemporaryLimit() + .setName("temporary1") + .setAcceptableDuration(100) + .setValue(50.) + .setFictitious(false) + .endTemporaryLimit() + .beginTemporaryLimit() + .setName("temporary2") + .setAcceptableDuration(150) + .setValue(70.) + .setFictitious(false) + .endTemporaryLimit() + .add(); + line3.setSelectedOperationalLimitsGroup1("group1"); + Substation p6 = network.newSubstation() .setId("P6") .setCountry(Country.FR) diff --git a/src/test/resources/all-data-in-variant.json b/src/test/resources/all-data-in-variant.json index 95aa6f65..104f1005 100644 --- a/src/test/resources/all-data-in-variant.json +++ b/src/test/resources/all-data-in-variant.json @@ -377,6 +377,26 @@ "country2": "FR", "terminal1Connected": true, "terminal2Connected": true, + "operationalLimitsGroup1": { + "group1": { + "permanentLimit": 220.0, + "temporaryLimits": [ + { + "name": "temporary2", + "value": 70.0, + "acceptableDuration": 150 + }, + { + "name": "temporary1", + "value": 50.0, + "acceptableDuration": 100 + } + ], + "applicability": null + } + }, + "operationalLimitsGroup1Names": ["group1"], + "selectedOperationalLimitsGroup1": "group1", "p1": 200.0, "p2": 100.0, "r": 3.0, diff --git a/src/test/resources/all-data.json b/src/test/resources/all-data.json index c40d15b4..2d81089a 100644 --- a/src/test/resources/all-data.json +++ b/src/test/resources/all-data.json @@ -367,6 +367,26 @@ "country2": "FR", "terminal1Connected": true, "terminal2Connected": true, + "operationalLimitsGroup1": { + "group1": { + "permanentLimit": 220.0, + "temporaryLimits": [ + { + "name": "temporary2", + "value": 70.0, + "acceptableDuration": 150 + }, + { + "name": "temporary1", + "value": 50.0, + "acceptableDuration": 100 + } + ], + "applicability": null + } + }, + "operationalLimitsGroup1Names": ["group1"], + "selectedOperationalLimitsGroup1": "group1", "p1": 200.0, "p2": 100.0, "r": 3.0, diff --git a/src/test/resources/line-tooltip-data-dc.json b/src/test/resources/line-tooltip-data-dc.json index 68a1afa2..f8d46b7b 100644 --- a/src/test/resources/line-tooltip-data-dc.json +++ b/src/test/resources/line-tooltip-data-dc.json @@ -6,6 +6,20 @@ "terminal2Connected": true, "i1": 6014.065304058601, "i2": 3007.0326520293006, + "currentLimits1":{ + "permanentLimit":220.0, + "temporaryLimits":[ + { + "name":"temporary2", + "value":70.0, + "acceptableDuration":150 + }, + {"name":"temporary1", + "value":50.0, + "acceptableDuration":100 + } + ], + "applicability":null}, "r": 3.0, "x": 33.0, "b1": 1.93E-4, diff --git a/src/test/resources/lines-form-data.json b/src/test/resources/lines-form-data.json index cc8f85f1..df092c7c 100644 --- a/src/test/resources/lines-form-data.json +++ b/src/test/resources/lines-form-data.json @@ -237,6 +237,45 @@ "voltageLevelId2": "VLGEN3", "terminal1Connected": true, "terminal2Connected": true, + "currentLimits1": [ + { + "id": "group1", + "permanentLimit": 220.0, + "temporaryLimits": [ + { + "name": "temporary2", + "value": 70.0, + "acceptableDuration": 150 + }, + { + "name": "temporary1", + "value": 50.0, + "acceptableDuration": 100 + } + ], + "applicability": null + } + ], + "currentLimits": [ + { + "id": "group1", + "permanentLimit": 220.0, + "temporaryLimits": [ + { + "name": "temporary2", + "value": 70.0, + "acceptableDuration": 150 + }, + { + "name": "temporary1", + "value": 50.0, + "acceptableDuration": 100 + } + ], + "applicability": "SIDE1" + } + ], + "selectedOperationalLimitsGroup1": "group1", "p1": 200.0, "p2": 100.0, "operatingStatus": "PLANNED_OUTAGE", diff --git a/src/test/resources/partial-all-data-in-variant.json b/src/test/resources/partial-all-data-in-variant.json index cfe8b848..a6efb369 100644 --- a/src/test/resources/partial-all-data-in-variant.json +++ b/src/test/resources/partial-all-data-in-variant.json @@ -62,6 +62,26 @@ "country2": "FR", "terminal1Connected": true, "terminal2Connected": true, + "operationalLimitsGroup1": { + "group1": { + "permanentLimit": 220.0, + "temporaryLimits": [ + { + "name": "temporary2", + "value": 70.0, + "acceptableDuration": 150 + }, + { + "name": "temporary1", + "value": 50.0, + "acceptableDuration": 100 + } + ], + "applicability": null + } + }, + "operationalLimitsGroup1Names": ["group1"], + "selectedOperationalLimitsGroup1": "group1", "p1": 200.0, "p2": 100.0, "r": 3.0, diff --git a/src/test/resources/partial-all-data.json b/src/test/resources/partial-all-data.json index c999a227..47527fa4 100644 --- a/src/test/resources/partial-all-data.json +++ b/src/test/resources/partial-all-data.json @@ -42,6 +42,26 @@ "country2": "FR", "terminal1Connected": true, "terminal2Connected": true, + "operationalLimitsGroup1": { + "group1": { + "permanentLimit": 220.0, + "temporaryLimits": [ + { + "name": "temporary2", + "value": 70.0, + "acceptableDuration": 150 + }, + { + "name": "temporary1", + "value": 50.0, + "acceptableDuration": 100 + } + ], + "applicability": null + } + }, + "operationalLimitsGroup1Names": ["group1"], + "selectedOperationalLimitsGroup1": "group1", "p1": 200.0, "p2": 100.0, "r": 3.0, diff --git a/src/test/resources/partial-all-map-data-no-redundant-lines.json b/src/test/resources/partial-all-map-data-no-redundant-lines.json index 2926d4a4..9228dfdc 100644 --- a/src/test/resources/partial-all-map-data-no-redundant-lines.json +++ b/src/test/resources/partial-all-map-data-no-redundant-lines.json @@ -80,6 +80,26 @@ "country2": "FR", "terminal1Connected": true, "terminal2Connected": true, + "operationalLimitsGroup1": { + "group1": { + "permanentLimit": 220.0, + "temporaryLimits": [ + { + "name": "temporary2", + "value": 70.0, + "acceptableDuration": 150 + }, + { + "name": "temporary1", + "value": 50.0, + "acceptableDuration": 100 + } + ], + "applicability": null + } + }, + "operationalLimitsGroup1Names": ["group1"], + "selectedOperationalLimitsGroup1": "group1", "p1": 200.0, "p2": 100.0, "r": 3.0, diff --git a/src/test/resources/partial-lines-form-data.json b/src/test/resources/partial-lines-form-data.json index c14dc861..9a3f63e1 100644 --- a/src/test/resources/partial-lines-form-data.json +++ b/src/test/resources/partial-lines-form-data.json @@ -27,6 +27,45 @@ "voltageLevelId2": "VLGEN3", "terminal1Connected": true, "terminal2Connected": true, + "currentLimits1": [ + { + "id": "group1", + "permanentLimit": 220.0, + "temporaryLimits": [ + { + "name": "temporary2", + "value": 70.0, + "acceptableDuration": 150 + }, + { + "name": "temporary1", + "value": 50.0, + "acceptableDuration": 100 + } + ], + "applicability": null + } + ], + "currentLimits": [ + { + "id": "group1", + "permanentLimit": 220.0, + "temporaryLimits": [ + { + "name": "temporary2", + "value": 70.0, + "acceptableDuration": 150 + }, + { + "name": "temporary1", + "value": 50.0, + "acceptableDuration": 100 + } + ], + "applicability": "SIDE1" + } + ], + "selectedOperationalLimitsGroup1": "group1", "p1": 200.0, "p2": 100.0, "operatingStatus": "PLANNED_OUTAGE", From 29e6879bd975bc9f8a770ec51e2240c148678948 Mon Sep 17 00:00:00 2001 From: basseche Date: Thu, 31 Jul 2025 15:50:40 +0200 Subject: [PATCH 20/22] increase tests coverage Signed-off-by: basseche --- .../network/map/NetworkMapControllerTest.java | 18 +++++++++ src/test/resources/all-data-in-variant.json | 20 ++++++++++ src/test/resources/all-data.json | 20 ++++++++++ src/test/resources/lines-form-data.json | 39 +++++++++++++++++++ .../partial-all-data-in-variant.json | 20 ++++++++++ src/test/resources/partial-all-data.json | 20 ++++++++++ ...rtial-all-map-data-no-redundant-lines.json | 20 ++++++++++ .../resources/partial-lines-form-data.json | 39 +++++++++++++++++++ 8 files changed, 196 insertions(+) diff --git a/src/test/java/org/gridsuite/network/map/NetworkMapControllerTest.java b/src/test/java/org/gridsuite/network/map/NetworkMapControllerTest.java index d722847a..b35fbd55 100644 --- a/src/test/java/org/gridsuite/network/map/NetworkMapControllerTest.java +++ b/src/test/java/org/gridsuite/network/map/NetworkMapControllerTest.java @@ -532,6 +532,24 @@ void setUp() { .setB2(386E-6 / 2) .add(); + Line line4 = network.getLine("LINE4"); + line4.newOperationalLimitsGroup2("group1").newCurrentLimits() + .setPermanentLimit(220.0) + .beginTemporaryLimit() + .setName("temporary1") + .setAcceptableDuration(100) + .setValue(50.) + .setFictitious(false) + .endTemporaryLimit() + .beginTemporaryLimit() + .setName("temporary2") + .setAcceptableDuration(150) + .setValue(70.) + .setFictitious(false) + .endTemporaryLimit() + .add(); + line4.setSelectedOperationalLimitsGroup2("group1"); + Battery b1 = vlnew2.newBattery() .setId("BATTERY1") .setName("BATTERY1") diff --git a/src/test/resources/all-data-in-variant.json b/src/test/resources/all-data-in-variant.json index 104f1005..e4bd07e8 100644 --- a/src/test/resources/all-data-in-variant.json +++ b/src/test/resources/all-data-in-variant.json @@ -456,6 +456,26 @@ "country2": "FR", "terminal1Connected": true, "terminal2Connected": true, + "operationalLimitsGroup2": { + "group1": { + "permanentLimit": 220.0, + "temporaryLimits": [ + { + "name": "temporary2", + "value": 70.0, + "acceptableDuration": 150 + }, + { + "name": "temporary1", + "value": 50.0, + "acceptableDuration": 100 + } + ], + "applicability": null + } + }, + "operationalLimitsGroup2Names": ["group1"], + "selectedOperationalLimitsGroup2": "group1", "r": 3.0, "x": 33.0, "g1": 0.0, diff --git a/src/test/resources/all-data.json b/src/test/resources/all-data.json index 2d81089a..0bd74378 100644 --- a/src/test/resources/all-data.json +++ b/src/test/resources/all-data.json @@ -446,6 +446,26 @@ "country2": "FR", "terminal1Connected": true, "terminal2Connected": true, + "operationalLimitsGroup2": { + "group1": { + "permanentLimit": 220.0, + "temporaryLimits": [ + { + "name": "temporary2", + "value": 70.0, + "acceptableDuration": 150 + }, + { + "name": "temporary1", + "value": 50.0, + "acceptableDuration": 100 + } + ], + "applicability": null + } + }, + "operationalLimitsGroup2Names": ["group1"], + "selectedOperationalLimitsGroup2": "group1", "r": 3.0, "x": 33.0, "g1": 0.0, diff --git a/src/test/resources/lines-form-data.json b/src/test/resources/lines-form-data.json index df092c7c..45906df5 100644 --- a/src/test/resources/lines-form-data.json +++ b/src/test/resources/lines-form-data.json @@ -316,6 +316,45 @@ "voltageLevelId2": "VLGEN3", "terminal1Connected": true, "terminal2Connected": true, + "currentLimits2": [ + { + "id": "group1", + "permanentLimit": 220.0, + "temporaryLimits": [ + { + "name": "temporary2", + "value": 70.0, + "acceptableDuration": 150 + }, + { + "name": "temporary1", + "value": 50.0, + "acceptableDuration": 100 + } + ], + "applicability": null + } + ], + "currentLimits": [ + { + "id": "group1", + "permanentLimit": 220.0, + "temporaryLimits": [ + { + "name": "temporary2", + "value": 70.0, + "acceptableDuration": 150 + }, + { + "name": "temporary1", + "value": 50.0, + "acceptableDuration": 100 + } + ], + "applicability": "SIDE2" + } + ], + "selectedOperationalLimitsGroup2": "group1", "r": 3.0, "x": 33.0, "g1": 0.0, diff --git a/src/test/resources/partial-all-data-in-variant.json b/src/test/resources/partial-all-data-in-variant.json index a6efb369..e8ed25d7 100644 --- a/src/test/resources/partial-all-data-in-variant.json +++ b/src/test/resources/partial-all-data-in-variant.json @@ -41,6 +41,26 @@ "country2": "FR", "terminal1Connected": true, "terminal2Connected": true, + "operationalLimitsGroup2": { + "group1": { + "permanentLimit": 220.0, + "temporaryLimits": [ + { + "name": "temporary2", + "value": 70.0, + "acceptableDuration": 150 + }, + { + "name": "temporary1", + "value": 50.0, + "acceptableDuration": 100 + } + ], + "applicability": null + } + }, + "operationalLimitsGroup2Names": ["group1"], + "selectedOperationalLimitsGroup2": "group1", "r": 3.0, "x": 33.0, "g1": 0.0, diff --git a/src/test/resources/partial-all-data.json b/src/test/resources/partial-all-data.json index 47527fa4..c4776a4e 100644 --- a/src/test/resources/partial-all-data.json +++ b/src/test/resources/partial-all-data.json @@ -121,6 +121,26 @@ "country2": "FR", "terminal1Connected": true, "terminal2Connected": true, + "operationalLimitsGroup2": { + "group1": { + "permanentLimit": 220.0, + "temporaryLimits": [ + { + "name": "temporary2", + "value": 70.0, + "acceptableDuration": 150 + }, + { + "name": "temporary1", + "value": 50.0, + "acceptableDuration": 100 + } + ], + "applicability": null + } + }, + "operationalLimitsGroup2Names": ["group1"], + "selectedOperationalLimitsGroup2": "group1", "r": 3.0, "x": 33.0, "g1": 0.0, diff --git a/src/test/resources/partial-all-map-data-no-redundant-lines.json b/src/test/resources/partial-all-map-data-no-redundant-lines.json index 9228dfdc..e5fd84ab 100644 --- a/src/test/resources/partial-all-map-data-no-redundant-lines.json +++ b/src/test/resources/partial-all-map-data-no-redundant-lines.json @@ -59,6 +59,26 @@ "country2": "FR", "terminal1Connected": true, "terminal2Connected": true, + "operationalLimitsGroup2": { + "group1": { + "permanentLimit": 220.0, + "temporaryLimits": [ + { + "name": "temporary2", + "value": 70.0, + "acceptableDuration": 150 + }, + { + "name": "temporary1", + "value": 50.0, + "acceptableDuration": 100 + } + ], + "applicability": null + } + }, + "operationalLimitsGroup2Names": ["group1"], + "selectedOperationalLimitsGroup2": "group1", "r": 3.0, "x": 33.0, "g1": 0.0, diff --git a/src/test/resources/partial-lines-form-data.json b/src/test/resources/partial-lines-form-data.json index 9a3f63e1..8597b401 100644 --- a/src/test/resources/partial-lines-form-data.json +++ b/src/test/resources/partial-lines-form-data.json @@ -5,6 +5,45 @@ "voltageLevelId2": "VLGEN3", "terminal1Connected": true, "terminal2Connected": true, + "currentLimits2": [ + { + "id": "group1", + "permanentLimit": 220.0, + "temporaryLimits": [ + { + "name": "temporary2", + "value": 70.0, + "acceptableDuration": 150 + }, + { + "name": "temporary1", + "value": 50.0, + "acceptableDuration": 100 + } + ], + "applicability": null + } + ], + "currentLimits": [ + { + "id": "group1", + "permanentLimit": 220.0, + "temporaryLimits": [ + { + "name": "temporary2", + "value": 70.0, + "acceptableDuration": 150 + }, + { + "name": "temporary1", + "value": 50.0, + "acceptableDuration": 100 + } + ], + "applicability": "SIDE2" + } + ], + "selectedOperationalLimitsGroup2": "group1", "r": 3.0, "x": 33.0, "g1": 0.0, From 5f64e3be59a3d73b6b9b1780cf1124cd32c68441 Mon Sep 17 00:00:00 2001 From: Mathieu DEHARBE Date: Fri, 1 Aug 2025 12:15:12 +0200 Subject: [PATCH 21/22] corrects TU Signed-off-by: Mathieu DEHARBE --- src/test/resources/lines-form-data.json | 38 ------------------- .../resources/partial-lines-form-data.json | 38 ------------------- 2 files changed, 76 deletions(-) diff --git a/src/test/resources/lines-form-data.json b/src/test/resources/lines-form-data.json index f760c0c0..63f87b85 100644 --- a/src/test/resources/lines-form-data.json +++ b/src/test/resources/lines-form-data.json @@ -147,25 +147,6 @@ "voltageLevelId2": "VLGEN3", "terminal1Connected": true, "terminal2Connected": true, - "currentLimits1": [ - { - "id": "group1", - "permanentLimit": 220.0, - "temporaryLimits": [ - { - "name": "temporary2", - "value": 70.0, - "acceptableDuration": 150 - }, - { - "name": "temporary1", - "value": 50.0, - "acceptableDuration": 100 - } - ], - "applicability": null - } - ], "currentLimits": [ { "id": "group1", @@ -226,25 +207,6 @@ "voltageLevelId2": "VLGEN3", "terminal1Connected": true, "terminal2Connected": true, - "currentLimits2": [ - { - "id": "group1", - "permanentLimit": 220.0, - "temporaryLimits": [ - { - "name": "temporary2", - "value": 70.0, - "acceptableDuration": 150 - }, - { - "name": "temporary1", - "value": 50.0, - "acceptableDuration": 100 - } - ], - "applicability": null - } - ], "currentLimits": [ { "id": "group1", diff --git a/src/test/resources/partial-lines-form-data.json b/src/test/resources/partial-lines-form-data.json index 8597b401..117e0775 100644 --- a/src/test/resources/partial-lines-form-data.json +++ b/src/test/resources/partial-lines-form-data.json @@ -5,25 +5,6 @@ "voltageLevelId2": "VLGEN3", "terminal1Connected": true, "terminal2Connected": true, - "currentLimits2": [ - { - "id": "group1", - "permanentLimit": 220.0, - "temporaryLimits": [ - { - "name": "temporary2", - "value": 70.0, - "acceptableDuration": 150 - }, - { - "name": "temporary1", - "value": 50.0, - "acceptableDuration": 100 - } - ], - "applicability": null - } - ], "currentLimits": [ { "id": "group1", @@ -66,25 +47,6 @@ "voltageLevelId2": "VLGEN3", "terminal1Connected": true, "terminal2Connected": true, - "currentLimits1": [ - { - "id": "group1", - "permanentLimit": 220.0, - "temporaryLimits": [ - { - "name": "temporary2", - "value": 70.0, - "acceptableDuration": 150 - }, - { - "name": "temporary1", - "value": 50.0, - "acceptableDuration": 100 - } - ], - "applicability": null - } - ], "currentLimits": [ { "id": "group1", From b40535fd61e877b944a6d7a6ccc3e29176cb97de Mon Sep 17 00:00:00 2001 From: Mathieu DEHARBE Date: Thu, 7 Aug 2025 15:41:56 +0200 Subject: [PATCH 22/22] corrections post conflicts Signed-off-by: Mathieu DEHARBE --- .../TwoWindingsTransformerFormInfos.java | 4 ---- .../org/gridsuite/network/map/dto/mapper/LineInfosMapper.java | 3 --- .../map/dto/mapper/TwoWindingsTransformerInfosMapper.java | 2 -- 3 files changed, 9 deletions(-) diff --git a/src/main/java/org/gridsuite/network/map/dto/definition/twowindingstransformer/TwoWindingsTransformerFormInfos.java b/src/main/java/org/gridsuite/network/map/dto/definition/twowindingstransformer/TwoWindingsTransformerFormInfos.java index 717fc6a1..0a456270 100644 --- a/src/main/java/org/gridsuite/network/map/dto/definition/twowindingstransformer/TwoWindingsTransformerFormInfos.java +++ b/src/main/java/org/gridsuite/network/map/dto/definition/twowindingstransformer/TwoWindingsTransformerFormInfos.java @@ -57,10 +57,6 @@ public class TwoWindingsTransformerFormInfos extends ElementInfosWithProperties @JsonInclude(JsonInclude.Include.NON_NULL) private Double i2; - // TODO : remove currentLimits1 and 2 to leave only currentLimits when modification is done - @JsonInclude(JsonInclude.Include.NON_EMPTY) - private List currentLimits; - @JsonInclude(JsonInclude.Include.NON_EMPTY) private List currentLimits; diff --git a/src/main/java/org/gridsuite/network/map/dto/mapper/LineInfosMapper.java b/src/main/java/org/gridsuite/network/map/dto/mapper/LineInfosMapper.java index ea241422..5e83013b 100644 --- a/src/main/java/org/gridsuite/network/map/dto/mapper/LineInfosMapper.java +++ b/src/main/java/org/gridsuite/network/map/dto/mapper/LineInfosMapper.java @@ -69,9 +69,6 @@ private static LineFormInfos toFormInfos(Identifiable identifiable) { .selectedOperationalLimitsGroup1(line.getSelectedOperationalLimitsGroupId1().orElse(null)) .selectedOperationalLimitsGroup2(line.getSelectedOperationalLimitsGroupId2().orElse(null)); - // TODO pourquoi est-ce en double ?? : - // mergeCurrentLimits(line.getOperationalLimitsGroups1(), line.getOperationalLimitsGroups2(), builder::currentLimits); - mergeCurrentLimits(line.getOperationalLimitsGroups1(), line.getOperationalLimitsGroups2(), builder::currentLimits); builder.busOrBusbarSectionId1(getBusOrBusbarSection(terminal1)) diff --git a/src/main/java/org/gridsuite/network/map/dto/mapper/TwoWindingsTransformerInfosMapper.java b/src/main/java/org/gridsuite/network/map/dto/mapper/TwoWindingsTransformerInfosMapper.java index 0b959ee3..af2f685d 100644 --- a/src/main/java/org/gridsuite/network/map/dto/mapper/TwoWindingsTransformerInfosMapper.java +++ b/src/main/java/org/gridsuite/network/map/dto/mapper/TwoWindingsTransformerInfosMapper.java @@ -80,8 +80,6 @@ private static TwoWindingsTransformerFormInfos toFormInfos(Identifiable ident builder.selectedOperationalLimitsGroup1(twoWT.getSelectedOperationalLimitsGroupId1().orElse(null)); builder.selectedOperationalLimitsGroup2(twoWT.getSelectedOperationalLimitsGroupId2().orElse(null)); - // TODO double ?? - // mergeCurrentLimits(twoWT.getOperationalLimitsGroups1(), twoWT.getOperationalLimitsGroups2(), builder::currentLimits); mergeCurrentLimits(twoWT.getOperationalLimitsGroups1(), twoWT.getOperationalLimitsGroups2(), builder::currentLimits); builder.operatingStatus(toOperatingStatus(twoWT));