diff --git a/src/main/java/org/gridsuite/modification/dto/BranchCreationInfos.java b/src/main/java/org/gridsuite/modification/dto/BranchCreationInfos.java index bb59e42..1d99fb3 100644 --- a/src/main/java/org/gridsuite/modification/dto/BranchCreationInfos.java +++ b/src/main/java/org/gridsuite/modification/dto/BranchCreationInfos.java @@ -14,6 +14,8 @@ import lombok.ToString; import lombok.experimental.SuperBuilder; +import java.util.List; + /** * @author Sylvain Bouzols */ @@ -43,11 +45,17 @@ public class BranchCreationInfos extends EquipmentCreationInfos { @Schema(description = "Bus or Busbar section id Side 2") private String busOrBusbarSectionId2; - @Schema(description = "Current limits Side 1") - private CurrentLimitsInfos currentLimits1; + @Schema(description = "Operational limit groups on side 1") + private List operationalLimitsGroups1; + + @Schema(description = "Operational limit groups on side 2") + private List operationalLimitsGroups2; + + @Schema(description = "Selected operational limits group on Side 1") + private String selectedOperationalLimitsGroup1; - @Schema(description = "Current limits Side 2") - private CurrentLimitsInfos currentLimits2; + @Schema(description = "Selected operational limits group on Side 2") + private String selectedOperationalLimitsGroup2; @Schema(description = "Connection Name 1") private String connectionName1; diff --git a/src/main/java/org/gridsuite/modification/dto/OperationalLimitsGroupInfos.java b/src/main/java/org/gridsuite/modification/dto/OperationalLimitsGroupInfos.java new file mode 100644 index 0000000..7872c28 --- /dev/null +++ b/src/main/java/org/gridsuite/modification/dto/OperationalLimitsGroupInfos.java @@ -0,0 +1,28 @@ +/* + Copyright (c) 2024, RTE (http://www.rte-france.com) + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ +package org.gridsuite.modification.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.ToString; +import lombok.experimental.SuperBuilder; + +@SuperBuilder +@NoArgsConstructor +@Getter +@Setter +@ToString +@Schema(description = "Operational limits group") +public class OperationalLimitsGroupInfos { + @Schema(description = "Operational limit group id") + private String id; + + @Schema(description = "Current limits") + private CurrentLimitsInfos currentLimits; +} diff --git a/src/main/java/org/gridsuite/modification/modifications/LineCreation.java b/src/main/java/org/gridsuite/modification/modifications/LineCreation.java index b574746..494de98 100644 --- a/src/main/java/org/gridsuite/modification/modifications/LineCreation.java +++ b/src/main/java/org/gridsuite/modification/modifications/LineCreation.java @@ -11,12 +11,16 @@ import com.powsybl.iidm.modification.topology.CreateBranchFeederBays; import com.powsybl.iidm.modification.topology.CreateBranchFeederBaysBuilder; import com.powsybl.iidm.network.*; +import org.apache.commons.collections4.CollectionUtils; import org.gridsuite.modification.NetworkModificationException; -import org.gridsuite.modification.dto.CurrentLimitsInfos; import org.gridsuite.modification.dto.LineCreationInfos; +import org.gridsuite.modification.dto.OperationalLimitsGroupInfos; import org.gridsuite.modification.utils.ModificationUtils; import org.gridsuite.modification.utils.PropertiesUtils; +import java.util.List; + +import static com.powsybl.iidm.network.TwoSides.*; import static org.gridsuite.modification.NetworkModificationException.Type.*; /** @@ -65,18 +69,35 @@ public void apply(Network network, ReportNode subReportNode) { } else { addLine(network, voltageLevel1, voltageLevel2, modificationInfos, true, true, subReportNode); } + ModificationUtils.getInstance().disconnectBranch(modificationInfos, network.getLine(modificationInfos.getEquipmentId()), subReportNode); + Line line = network.getLine(modificationInfos.getEquipmentId()); // Set permanent and temporary current limits - CurrentLimitsInfos currentLimitsInfos1 = modificationInfos.getCurrentLimits1(); - CurrentLimitsInfos currentLimitsInfos2 = modificationInfos.getCurrentLimits2(); - if (currentLimitsInfos1 != null || currentLimitsInfos2 != null) { - var line = ModificationUtils.getInstance().getLine(network, modificationInfos.getEquipmentId()); - ModificationUtils.getInstance().setCurrentLimits(currentLimitsInfos1, line.newCurrentLimits1()); - ModificationUtils.getInstance().setCurrentLimits(currentLimitsInfos2, line.newCurrentLimits2()); + List opLimitsGroupSide1 = modificationInfos.getOperationalLimitsGroups1(); + List opLimitsGroupSide2 = modificationInfos.getOperationalLimitsGroups2(); + if (!CollectionUtils.isEmpty(opLimitsGroupSide1)) { + ModificationUtils.getInstance().setCurrentLimitsOnASide(opLimitsGroupSide1, line, ONE, subReportNode); + } + if (!CollectionUtils.isEmpty(opLimitsGroupSide2)) { + ModificationUtils.getInstance().setCurrentLimitsOnASide(opLimitsGroupSide2, line, TWO, subReportNode); } - ModificationUtils.getInstance().disconnectBranch(modificationInfos, network.getLine(modificationInfos.getEquipmentId()), subReportNode); // properties - Line line = network.getLine(modificationInfos.getEquipmentId()); + if (modificationInfos.getSelectedOperationalLimitsGroup1() != null) { + line.setSelectedOperationalLimitsGroup1(modificationInfos.getSelectedOperationalLimitsGroup1()); + subReportNode.newReportNode() + .withMessageTemplate("limit set selected on side 1", "limit set selected on side 1 : ${selectedOperationalLimitsGroup1}") + .withUntypedValue("selectedOperationalLimitsGroup1", modificationInfos.getSelectedOperationalLimitsGroup1()) + .withSeverity(TypedValue.INFO_SEVERITY) + .add(); + } + if (modificationInfos.getSelectedOperationalLimitsGroup2() != null) { + line.setSelectedOperationalLimitsGroup2(modificationInfos.getSelectedOperationalLimitsGroup2()); + subReportNode.newReportNode() + .withMessageTemplate("limit set selected on side 2", "limit set selected on side 2 : ${selectedOperationalLimitsGroup2}") + .withUntypedValue("selectedOperationalLimitsGroup2", modificationInfos.getSelectedOperationalLimitsGroup2()) + .withSeverity(TypedValue.INFO_SEVERITY) + .add(); + } PropertiesUtils.applyProperties(line, subReportNode, modificationInfos.getProperties(), "LineProperties"); } diff --git a/src/main/java/org/gridsuite/modification/modifications/TwoWindingsTransformerCreation.java b/src/main/java/org/gridsuite/modification/modifications/TwoWindingsTransformerCreation.java index 5e7adc1..9361863 100644 --- a/src/main/java/org/gridsuite/modification/modifications/TwoWindingsTransformerCreation.java +++ b/src/main/java/org/gridsuite/modification/modifications/TwoWindingsTransformerCreation.java @@ -11,11 +11,13 @@ import com.powsybl.iidm.modification.topology.CreateBranchFeederBays; import com.powsybl.iidm.modification.topology.CreateBranchFeederBaysBuilder; import com.powsybl.iidm.network.*; +import org.apache.commons.collections4.CollectionUtils; import org.gridsuite.modification.NetworkModificationException; import org.gridsuite.modification.dto.*; import org.gridsuite.modification.utils.ModificationUtils; import org.gridsuite.modification.utils.PropertiesUtils; +import java.util.List; import java.util.Optional; import static org.gridsuite.modification.NetworkModificationException.Type.*; @@ -53,11 +55,29 @@ public void apply(Network network, ReportNode subReportNode) { } // Set permanent and temporary current limits - CurrentLimitsInfos currentLimitsInfos1 = modificationInfos.getCurrentLimits1(); - CurrentLimitsInfos currentLimitsInfos2 = modificationInfos.getCurrentLimits2(); - if (currentLimitsInfos1 != null || currentLimitsInfos2 != null) { - ModificationUtils.getInstance().setCurrentLimits(currentLimitsInfos1, twoWindingsTransformer.newCurrentLimits1()); - ModificationUtils.getInstance().setCurrentLimits(currentLimitsInfos2, twoWindingsTransformer.newCurrentLimits2()); + List opLimitsGroupSide1 = modificationInfos.getOperationalLimitsGroups1(); + List opLimitsGroupSide2 = modificationInfos.getOperationalLimitsGroups2(); + if (!CollectionUtils.isEmpty(opLimitsGroupSide1)) { + ModificationUtils.getInstance().setCurrentLimitsOnASide(opLimitsGroupSide1, twoWindingsTransformer, TwoSides.ONE, subReportNode); + } + if (!CollectionUtils.isEmpty(opLimitsGroupSide2)) { + ModificationUtils.getInstance().setCurrentLimitsOnASide(opLimitsGroupSide2, twoWindingsTransformer, TwoSides.TWO, subReportNode); + } + if (modificationInfos.getSelectedOperationalLimitsGroup1() != null) { + twoWindingsTransformer.setSelectedOperationalLimitsGroup1(modificationInfos.getSelectedOperationalLimitsGroup1()); + subReportNode.newReportNode() + .withMessageTemplate("limit set selected on side 1", "limit set selected on side 1 : ${selectedOperationalLimitsGroup1}") + .withUntypedValue("selectedOperationalLimitsGroup1", modificationInfos.getSelectedOperationalLimitsGroup1()) + .withSeverity(TypedValue.INFO_SEVERITY) + .add(); + } + if (modificationInfos.getSelectedOperationalLimitsGroup2() != null) { + twoWindingsTransformer.setSelectedOperationalLimitsGroup2(modificationInfos.getSelectedOperationalLimitsGroup2()); + subReportNode.newReportNode() + .withMessageTemplate("limit set selected on side 2", "limit set selected on side 2 : ${selectedOperationalLimitsGroup2}") + .withUntypedValue("selectedOperationalLimitsGroup2", modificationInfos.getSelectedOperationalLimitsGroup2()) + .withSeverity(TypedValue.INFO_SEVERITY) + .add(); } ModificationUtils.getInstance().disconnectBranch(modificationInfos, network.getTwoWindingsTransformer(modificationInfos.getEquipmentId()), subReportNode); diff --git a/src/main/java/org/gridsuite/modification/utils/ModificationUtils.java b/src/main/java/org/gridsuite/modification/utils/ModificationUtils.java index 866bcb8..29e43ba 100644 --- a/src/main/java/org/gridsuite/modification/utils/ModificationUtils.java +++ b/src/main/java/org/gridsuite/modification/utils/ModificationUtils.java @@ -34,6 +34,7 @@ import javax.annotation.Nullable; +import static com.powsybl.iidm.network.TwoSides.ONE; import static org.gridsuite.modification.NetworkModificationException.Type.*; /** @@ -445,7 +446,7 @@ public LineAdder createLineAdder(Network network, VoltageLevel voltageLevel1, Vo .setB2(lineCreationInfos.getB2() != null ? lineCreationInfos.getB2() : 0.0); // lineAdder completion by topology - setBranchAdderNodeOrBus(lineAdder, voltageLevel1, lineCreationInfos, TwoSides.ONE, withSwitch1); + setBranchAdderNodeOrBus(lineAdder, voltageLevel1, lineCreationInfos, ONE, withSwitch1); setBranchAdderNodeOrBus(lineAdder, voltageLevel2, lineCreationInfos, TwoSides.TWO, withSwitch2); return lineAdder; @@ -453,7 +454,7 @@ public LineAdder createLineAdder(Network network, VoltageLevel voltageLevel1, Vo public void setBranchAdderNodeOrBus(BranchAdder branchAdder, VoltageLevel voltageLevel, BranchCreationInfos branchCreationInfos, TwoSides side, boolean withSwitch) { - String busOrBusbarSectionId = (side == TwoSides.ONE) ? branchCreationInfos.getBusOrBusbarSectionId1() : branchCreationInfos.getBusOrBusbarSectionId2(); + String busOrBusbarSectionId = (side == ONE) ? branchCreationInfos.getBusOrBusbarSectionId1() : branchCreationInfos.getBusOrBusbarSectionId2(); if (voltageLevel.getTopologyKind() == TopologyKind.BUS_BREAKER) { setBranchAdderBusBreaker(branchAdder, voltageLevel, side, busOrBusbarSectionId); } else { @@ -467,7 +468,7 @@ private void setBranchAdderBusBreaker(BranchAdder branchAdder, VoltageLeve Bus bus = getBusBreakerBus(voltageLevel, busId); // complete the lineAdder - if (side == TwoSides.ONE) { + if (side == ONE) { branchAdder.setBus1(bus.getId()).setConnectableBus1(bus.getId()); } else { branchAdder.setBus2(bus.getId()).setConnectableBus2(bus.getId()); @@ -486,7 +487,7 @@ private void setBranchAdderNodeBreaker(BranchAdder branchAdder, VoltageLev sideSuffix); // complete the lineAdder - if (side == TwoSides.ONE) { + if (side == ONE) { branchAdder.setNode1(nodeNum); } else { branchAdder.setNode2(nodeNum); @@ -1015,26 +1016,54 @@ public Identifiable getEquipmentByIdentifiableType(Network network, Identifia }; } - public void setCurrentLimits(CurrentLimitsInfos currentLimitsInfos, CurrentLimitsAdder limitsAdder) { - if (currentLimitsInfos != null) { - boolean hasPermanent = currentLimitsInfos.getPermanentLimit() != null; - boolean hasTemporary = currentLimitsInfos.getTemporaryLimits() != null && !currentLimitsInfos.getTemporaryLimits().isEmpty(); + /** + * @param opLimitGroups added current limits + * @param branch branch to which limits are going to be added + * @param side which side of the branch receives the limits + */ + public void setCurrentLimitsOnASide(List opLimitGroups, Branch branch, TwoSides side, ReportNode subReportNode) { + List reportNodes = new ArrayList<>(); + for (OperationalLimitsGroupInfos opLimitsGroup : opLimitGroups) { + boolean hasPermanent = opLimitsGroup.getCurrentLimits().getPermanentLimit() != null; + boolean hasTemporary = !CollectionUtils.isEmpty(opLimitsGroup.getCurrentLimits().getTemporaryLimits()); + boolean hasLimits = hasPermanent || hasTemporary; + + if (!hasLimits) { + continue; + } + + OperationalLimitsGroup opGroup = side == ONE + ? branch.newOperationalLimitsGroup1(opLimitsGroup.getId()) + : branch.newOperationalLimitsGroup2(opLimitsGroup.getId()); + if (opLimitsGroup.getId() != null) { + reportNodes.add(ReportNode.newRootReportNode().withMessageTemplate("limitSetAdded", " ${name} added") + .withUntypedValue("name", opLimitsGroup.getId()) + .withSeverity(TypedValue.INFO_SEVERITY) + .build()); + } + CurrentLimitsAdder limitsAdder = opGroup.newCurrentLimits(); if (hasPermanent) { - limitsAdder.setPermanentLimit(currentLimitsInfos.getPermanentLimit()); + limitsAdder.setPermanentLimit(opLimitsGroup.getCurrentLimits().getPermanentLimit()); } if (hasTemporary) { - for (CurrentTemporaryLimitCreationInfos limit : currentLimitsInfos.getTemporaryLimits()) { - limitsAdder - .beginTemporaryLimit() + opLimitsGroup.getCurrentLimits().getTemporaryLimits().forEach(limit -> { + double value = limit.getValue() != null ? limit.getValue() : Double.MAX_VALUE; + int duration = limit.getAcceptableDuration() != null ? limit.getAcceptableDuration() : Integer.MAX_VALUE; + + limitsAdder.beginTemporaryLimit() .setName(limit.getName()) - .setValue(limit.getValue() == null ? Double.MAX_VALUE : limit.getValue()) - .setAcceptableDuration(limit.getAcceptableDuration() == null ? Integer.MAX_VALUE : limit.getAcceptableDuration()) + .setValue(value) + .setAcceptableDuration(duration) .endTemporaryLimit(); - } - } - if (hasPermanent || hasTemporary) { - limitsAdder.add(); + }); } + limitsAdder.add(); + } + if (!reportNodes.isEmpty()) { + String sideStr = side == ONE ? "side one" : "side two"; + ModificationUtils.getInstance().reportModifications(subReportNode, reportNodes, + "LimitSets" + sideStr, "Limit sets on side " + sideStr + ); } } diff --git a/src/test/java/org/gridsuite/modification/modifications/LineCreationInBusBreakerTest.java b/src/test/java/org/gridsuite/modification/modifications/LineCreationInBusBreakerTest.java index fbab449..e2f4413 100644 --- a/src/test/java/org/gridsuite/modification/modifications/LineCreationInBusBreakerTest.java +++ b/src/test/java/org/gridsuite/modification/modifications/LineCreationInBusBreakerTest.java @@ -11,10 +11,7 @@ import com.powsybl.iidm.network.ValidationException; import org.gridsuite.modification.NetworkModificationException; -import org.gridsuite.modification.dto.CurrentLimitsInfos; -import org.gridsuite.modification.dto.FreePropertyInfos; -import org.gridsuite.modification.dto.LineCreationInfos; -import org.gridsuite.modification.dto.ModificationInfos; +import org.gridsuite.modification.dto.*; import org.gridsuite.modification.utils.NetworkCreation; import org.junit.jupiter.api.Test; import java.util.Collections; @@ -54,7 +51,16 @@ void testCreateLineOptionalParameters5() throws Exception { .busOrBusbarSectionId1("bus1") .voltageLevelId2("v2") .busOrBusbarSectionId2("bus2") - .currentLimits1(CurrentLimitsInfos.builder().permanentLimit(-1.0).build()) + .operationalLimitsGroups1( + List.of( + OperationalLimitsGroupInfos.builder() + .id("limiSet1") + .currentLimits( + CurrentLimitsInfos.builder().permanentLimit(-1.0).build() + ).build() + ) + ) + .selectedOperationalLimitsGroup1("limiSet1") .build(); ValidationException exception = assertThrows(ValidationException.class, () -> lineCreationInfosPermanentLimitNOK.toModification().apply(getNetwork())); assertEquals("AC Line 'idLine2': permanent limit must be >= 0", exception.getMessage()); @@ -82,8 +88,26 @@ protected ModificationInfos buildModification() { .b2(20.0) .voltageLevelId1("v1") .busOrBusbarSectionId1("bus1") - .currentLimits1(CurrentLimitsInfos.builder().permanentLimit(5.).temporaryLimits(Collections.emptyList()).build()) - .currentLimits2(CurrentLimitsInfos.builder().permanentLimit(5.).temporaryLimits(Collections.emptyList()).build()) + .operationalLimitsGroups1( + List.of( + OperationalLimitsGroupInfos.builder() + .id("limitSet1") + .currentLimits( + CurrentLimitsInfos.builder().permanentLimit(5.).temporaryLimits(Collections.emptyList()).build() + ).build() + ) + ) + .operationalLimitsGroups2( + List.of( + OperationalLimitsGroupInfos.builder() + .id("limitSet2") + .currentLimits( + CurrentLimitsInfos.builder().permanentLimit(5.).temporaryLimits(Collections.emptyList()).build() + ).build() + ) + ) + .selectedOperationalLimitsGroup1("limitSet1") + .selectedOperationalLimitsGroup2("limitSet2") .voltageLevelId2("v2") .busOrBusbarSectionId2("bus2") .properties(List.of(FreePropertyInfos.builder().name(PROPERTY_NAME).value(PROPERTY_VALUE).build())) diff --git a/src/test/java/org/gridsuite/modification/modifications/TwoWindingsTransformerCreationBusBreakerTest.java b/src/test/java/org/gridsuite/modification/modifications/TwoWindingsTransformerCreationBusBreakerTest.java index eae082c..227bf4d 100644 --- a/src/test/java/org/gridsuite/modification/modifications/TwoWindingsTransformerCreationBusBreakerTest.java +++ b/src/test/java/org/gridsuite/modification/modifications/TwoWindingsTransformerCreationBusBreakerTest.java @@ -52,8 +52,34 @@ protected ModificationInfos buildModification() { .voltageLevelId2("v12") .busOrBusbarSectionId2("bus12") .connected2(true) - .currentLimits1(CurrentLimitsInfos.builder().permanentLimit(3.).temporaryLimits(List.of(CurrentTemporaryLimitCreationInfos.builder().name("IT5").acceptableDuration(98647).value(45.).build())).build()) - .currentLimits2(CurrentLimitsInfos.builder().permanentLimit(2.).temporaryLimits(List.of(CurrentTemporaryLimitCreationInfos.builder().name("IT10").acceptableDuration(683647).value(791.).build())).build()) + .operationalLimitsGroups1( + List.of( + OperationalLimitsGroupInfos.builder() + .id("limitSet1") + .currentLimits( + CurrentLimitsInfos.builder() + .permanentLimit(3.) + .temporaryLimits( + List.of(CurrentTemporaryLimitCreationInfos.builder().name("IT5").acceptableDuration(98647).value(45.).build()) + ).build() + ).build() + ) + ) + .operationalLimitsGroups2( + List.of( + OperationalLimitsGroupInfos.builder() + .id("limitSet2") + .currentLimits( + CurrentLimitsInfos.builder() + .permanentLimit(2.) + .temporaryLimits( + List.of(CurrentTemporaryLimitCreationInfos.builder().name("IT10").acceptableDuration(683647).value(791.).build()) + ).build()) + .build() + ) + ) + .selectedOperationalLimitsGroup1("limitSet1") + .selectedOperationalLimitsGroup2("limitSet2") .connectionName1("cn201") .connectionDirection1(ConnectablePosition.Direction.TOP) .connectionName2("cn202") diff --git a/src/test/java/org/gridsuite/modification/modifications/TwoWindingsTransformerCreationNodeBreakerTest.java b/src/test/java/org/gridsuite/modification/modifications/TwoWindingsTransformerCreationNodeBreakerTest.java index d648a94..9999d6a 100644 --- a/src/test/java/org/gridsuite/modification/modifications/TwoWindingsTransformerCreationNodeBreakerTest.java +++ b/src/test/java/org/gridsuite/modification/modifications/TwoWindingsTransformerCreationNodeBreakerTest.java @@ -15,6 +15,7 @@ import org.gridsuite.modification.dto.*; import org.gridsuite.modification.utils.NetworkCreation; import org.junit.jupiter.api.Test; + import java.util.List; import java.util.Map; import java.util.UUID; @@ -52,8 +53,22 @@ protected ModificationInfos buildModification() { .voltageLevelId2("v2") .busOrBusbarSectionId2("1A") .connected2(true) - .currentLimits1(CurrentLimitsInfos.builder().permanentLimit(3.).temporaryLimits(List.of(CurrentTemporaryLimitCreationInfos.builder().name("IT5").acceptableDuration(2147483647).value(671.).build())).build()) - .currentLimits2(CurrentLimitsInfos.builder().permanentLimit(2.).temporaryLimits(List.of(CurrentTemporaryLimitCreationInfos.builder().name("IT10").acceptableDuration(683647).value(791.).build())).build()) + .operationalLimitsGroups1( + List.of( + OperationalLimitsGroupInfos.builder() + .currentLimits( + CurrentLimitsInfos.builder().permanentLimit(3.).temporaryLimits(List.of(CurrentTemporaryLimitCreationInfos.builder().name("IT5").acceptableDuration(2147483647).value(671.).build())).build() + ).build() + ) + ) + .operationalLimitsGroups2( + List.of( + OperationalLimitsGroupInfos.builder() + .currentLimits( + CurrentLimitsInfos.builder().permanentLimit(2.).temporaryLimits(List.of(CurrentTemporaryLimitCreationInfos.builder().name("IT10").acceptableDuration(683647).value(791.).build())).build() + ).build() + ) + ) .connectionName1("cn201") .connectionDirection1(ConnectablePosition.Direction.TOP) .connected1(true) @@ -219,7 +234,7 @@ void testCreateTwoWindingsTransformerWithRatioTapChangerInNodeBreaker() throws E testCreateTwoWindingsTransformerInNodeBreaker(twoWindingsTransformerCreationInfos2); assertEquals( - "TwoWindingsTransformerCreationInfos(super=BranchCreationInfos(super=EquipmentCreationInfos(super=EquipmentModificationInfos(super=ModificationInfos(uuid=null, type=TWO_WINDINGS_TRANSFORMER_CREATION, date=null, stashed=false, messageType=null, messageValues=null, activated=true), equipmentId=id2wt1WithRatioTapChanger2, properties=null), equipmentName=2wtName), r=400.0, x=300.0, voltageLevelId1=v1, voltageLevelId2=v4, busOrBusbarSectionId1=1.1, busOrBusbarSectionId2=1.A, currentLimits1=null, currentLimits2=null, connectionName1=null, connectionDirection1=TOP, connectionName2=null, connectionDirection2=TOP, connectionPosition1=null, connectionPosition2=null, connected1=true, connected2=true), g=100.0, b=200.0, ratedU1=1000.0, ratedU2=1010.0, ratedS=null, ratioTapChanger=RatioTapChangerCreationInfos(super=TapChangerCreationInfos(lowTapPosition=0, tapPosition=1, regulating=true, targetDeadband=null, regulatingTerminalId=v1load, regulatingTerminalType=LOAD, regulatingTerminalVlId=v1, steps=[TapChangerStepCreationInfos(index=0, rho=1.0, r=39.78473, x=39.784725, g=0.0, b=0.0, alpha=0.0), TapChangerStepCreationInfos(index=0, rho=1.0, r=39.78474, x=39.784726, g=0.0, b=0.0, alpha=0.0), TapChangerStepCreationInfos(index=0, rho=1.0, r=39.78475, x=39.784727, g=0.0, b=0.0, alpha=0.0)]), loadTapChangingCapabilities=true, targetV=220.0), phaseTapChanger=null)", + "TwoWindingsTransformerCreationInfos(super=BranchCreationInfos(super=EquipmentCreationInfos(super=EquipmentModificationInfos(super=ModificationInfos(uuid=null, type=TWO_WINDINGS_TRANSFORMER_CREATION, date=null, stashed=false, messageType=null, messageValues=null, activated=true), equipmentId=id2wt1WithRatioTapChanger2, properties=null), equipmentName=2wtName), r=400.0, x=300.0, voltageLevelId1=v1, voltageLevelId2=v4, busOrBusbarSectionId1=1.1, busOrBusbarSectionId2=1.A, operationalLimitsGroups1=null, operationalLimitsGroups2=null, selectedOperationalLimitsGroup1=null, selectedOperationalLimitsGroup2=null, connectionName1=null, connectionDirection1=TOP, connectionName2=null, connectionDirection2=TOP, connectionPosition1=null, connectionPosition2=null, connected1=true, connected2=true), g=100.0, b=200.0, ratedU1=1000.0, ratedU2=1010.0, ratedS=null, ratioTapChanger=RatioTapChangerCreationInfos(super=TapChangerCreationInfos(lowTapPosition=0, tapPosition=1, regulating=true, targetDeadband=null, regulatingTerminalId=v1load, regulatingTerminalType=LOAD, regulatingTerminalVlId=v1, steps=[TapChangerStepCreationInfos(index=0, rho=1.0, r=39.78473, x=39.784725, g=0.0, b=0.0, alpha=0.0), TapChangerStepCreationInfos(index=0, rho=1.0, r=39.78474, x=39.784726, g=0.0, b=0.0, alpha=0.0), TapChangerStepCreationInfos(index=0, rho=1.0, r=39.78475, x=39.784727, g=0.0, b=0.0, alpha=0.0)]), loadTapChangingCapabilities=true, targetV=220.0), phaseTapChanger=null)", twoWindingsTransformerCreationInfos2.toString() );