diff --git a/iidm/iidm-api/src/main/java/com/powsybl/iidm/network/AdderUser.java b/iidm/iidm-api/src/main/java/com/powsybl/iidm/network/AdderUser.java new file mode 100644 index 00000000000..964a305e8e4 --- /dev/null +++ b/iidm/iidm-api/src/main/java/com/powsybl/iidm/network/AdderUser.java @@ -0,0 +1,5 @@ +package com.powsybl.iidm.network; + +public interface AdderUser { + void collectAdder(ChildAdder childAdder); +} diff --git a/iidm/iidm-api/src/main/java/com/powsybl/iidm/network/CurrentLimitsNestedAdder.java b/iidm/iidm-api/src/main/java/com/powsybl/iidm/network/CurrentLimitsNestedAdder.java new file mode 100644 index 00000000000..b3d14e6e51c --- /dev/null +++ b/iidm/iidm-api/src/main/java/com/powsybl/iidm/network/CurrentLimitsNestedAdder.java @@ -0,0 +1,7 @@ +package com.powsybl.iidm.network; + +public interface CurrentLimitsNestedAdder>> + extends NestedAdder>, + CurrentLimitsPayload>, + AdderUser>> { +} diff --git a/iidm/iidm-api/src/main/java/com/powsybl/iidm/network/CurrentLimitsPayload.java b/iidm/iidm-api/src/main/java/com/powsybl/iidm/network/CurrentLimitsPayload.java new file mode 100644 index 00000000000..8093eb2874c --- /dev/null +++ b/iidm/iidm-api/src/main/java/com/powsybl/iidm/network/CurrentLimitsPayload.java @@ -0,0 +1,11 @@ +package com.powsybl.iidm.network; + +public interface CurrentLimitsPayload>> { + ExtendingAdder setPermanentLimit(double permanentLimit); + + double getPermanentLimit(); + + CurrentLimitsAdder fill(CurrentLimitsAdder adder); + + TemporaryLimitNestedAdder beginTemporaryLimit(); +} diff --git a/iidm/iidm-api/src/main/java/com/powsybl/iidm/network/LineAdder.java b/iidm/iidm-api/src/main/java/com/powsybl/iidm/network/LineAdder.java index 49bf209a8cd..babbceb36a4 100644 --- a/iidm/iidm-api/src/main/java/com/powsybl/iidm/network/LineAdder.java +++ b/iidm/iidm-api/src/main/java/com/powsybl/iidm/network/LineAdder.java @@ -24,7 +24,7 @@ * @see Line * @see Network */ -public interface LineAdder extends BranchAdder { +public interface LineAdder extends BranchAdder, AdderUser> { LineAdder setR(double r); @@ -38,6 +38,8 @@ public interface LineAdder extends BranchAdder { LineAdder setB2(double b2); + CurrentLimitsNestedAdder beginCurrentLimits(); + @Override Line add(); diff --git a/iidm/iidm-api/src/main/java/com/powsybl/iidm/network/NestedAdder.java b/iidm/iidm-api/src/main/java/com/powsybl/iidm/network/NestedAdder.java new file mode 100644 index 00000000000..e9dd02026d3 --- /dev/null +++ b/iidm/iidm-api/src/main/java/com/powsybl/iidm/network/NestedAdder.java @@ -0,0 +1,5 @@ +package com.powsybl.iidm.network; + +public interface NestedAdder, ExtendingAdder> { + ParentAdder end(); +} diff --git a/iidm/iidm-api/src/main/java/com/powsybl/iidm/network/TemporaryLimitNestedAdder.java b/iidm/iidm-api/src/main/java/com/powsybl/iidm/network/TemporaryLimitNestedAdder.java new file mode 100644 index 00000000000..7bebba50f7e --- /dev/null +++ b/iidm/iidm-api/src/main/java/com/powsybl/iidm/network/TemporaryLimitNestedAdder.java @@ -0,0 +1,6 @@ +package com.powsybl.iidm.network; + +public interface TemporaryLimitNestedAdder>> + extends NestedAdder>, + TemporaryLimitPayload> { +} diff --git a/iidm/iidm-api/src/main/java/com/powsybl/iidm/network/TemporaryLimitPayload.java b/iidm/iidm-api/src/main/java/com/powsybl/iidm/network/TemporaryLimitPayload.java new file mode 100644 index 00000000000..4559d0abddd --- /dev/null +++ b/iidm/iidm-api/src/main/java/com/powsybl/iidm/network/TemporaryLimitPayload.java @@ -0,0 +1,9 @@ +package com.powsybl.iidm.network; + +public interface TemporaryLimitPayload { + ExtendingAdder setName(String name); + + String getName(); + + LoadingLimitsAdder.TemporaryLimitAdder fill(LoadingLimitsAdder.TemporaryLimitAdder adder); +} diff --git a/iidm/iidm-impl/src/main/java/com/powsybl/iidm/network/impl/CurrentLimitsNestedAdderImpl.java b/iidm/iidm-impl/src/main/java/com/powsybl/iidm/network/impl/CurrentLimitsNestedAdderImpl.java new file mode 100644 index 00000000000..1856ee039cc --- /dev/null +++ b/iidm/iidm-impl/src/main/java/com/powsybl/iidm/network/impl/CurrentLimitsNestedAdderImpl.java @@ -0,0 +1,55 @@ +package com.powsybl.iidm.network.impl; + +import com.powsybl.iidm.network.AdderUser; +import com.powsybl.iidm.network.CurrentLimitsAdder; +import com.powsybl.iidm.network.CurrentLimitsNestedAdder; +import com.powsybl.iidm.network.TemporaryLimitNestedAdder; + +import java.util.ArrayList; +import java.util.List; + +public class CurrentLimitsNestedAdderImpl>> + implements CurrentLimitsNestedAdder, + AdderUser>> { + private ParentAdder parentAdder; + private double permanentLimit; + private List>> temporaryLimits = new ArrayList<>(); + + public CurrentLimitsNestedAdderImpl(ParentAdder parentAdder) { + this.parentAdder = parentAdder; + } + + @Override + public CurrentLimitsNestedAdder setPermanentLimit(double permanentLimit) { + this.permanentLimit = permanentLimit; + return this; + } + + @Override + public double getPermanentLimit() { + return this.permanentLimit; + } + + @Override + public CurrentLimitsAdder fill(CurrentLimitsAdder adder) { + adder.setPermanentLimit(this.permanentLimit); + temporaryLimits.forEach(limit -> limit.fill(adder.beginTemporaryLimit()).endTemporaryLimit()); + return adder; + } + + @Override + public TemporaryLimitNestedAdder> beginTemporaryLimit() { + return new TemporaryLimitNestedAdderImpl(this); + } + + @Override + public ParentAdder end() { + parentAdder.collectAdder(this); + return parentAdder; + } + + @Override + public void collectAdder(TemporaryLimitNestedAdder> adder) { + this.temporaryLimits.add(adder); + } +} diff --git a/iidm/iidm-impl/src/main/java/com/powsybl/iidm/network/impl/LineAdderImpl.java b/iidm/iidm-impl/src/main/java/com/powsybl/iidm/network/impl/LineAdderImpl.java index e9701b6b432..21c5cf56816 100644 --- a/iidm/iidm-impl/src/main/java/com/powsybl/iidm/network/impl/LineAdderImpl.java +++ b/iidm/iidm-impl/src/main/java/com/powsybl/iidm/network/impl/LineAdderImpl.java @@ -7,16 +7,16 @@ */ package com.powsybl.iidm.network.impl; -import com.powsybl.iidm.network.LineAdder; -import com.powsybl.iidm.network.ValidationException; -import com.powsybl.iidm.network.ValidationUtil; +import com.powsybl.iidm.network.*; import com.powsybl.commons.ref.Ref; +import java.util.Optional; + /** * * @author Geoffroy Jamgotchian {@literal } */ -class LineAdderImpl extends AbstractBranchAdder implements LineAdder { +class LineAdderImpl extends AbstractBranchAdder implements LineAdder, AdderUser> { private final NetworkImpl network; private final String subnetwork; @@ -32,6 +32,7 @@ class LineAdderImpl extends AbstractBranchAdder implements LineAd private double g2 = 0.0; private double b2 = 0.0; + private Optional> currentLimitsNestedAdder = Optional.empty(); LineAdderImpl(NetworkImpl network, String subnetwork) { this.network = network; @@ -84,6 +85,11 @@ public LineAdderImpl setB2(double b2) { return this; } + @Override + public CurrentLimitsNestedAdder beginCurrentLimits() { + return new CurrentLimitsNestedAdderImpl(this); + } + @Override public LineImpl add() { String id = checkAndGetUniqueId(); @@ -118,7 +124,12 @@ public LineImpl add() { voltageLevel2.attach(terminal2, false); network.getIndex().checkAndAdd(line); getNetwork().getListeners().notifyCreation(line); + this.currentLimitsNestedAdder.map(adder -> adder.fill(line.newCurrentLimits1()).add()); return line; } + @Override + public void collectAdder(CurrentLimitsNestedAdder currentLimitsNestedAdder) { + this.currentLimitsNestedAdder = Optional.of(currentLimitsNestedAdder); + } } diff --git a/iidm/iidm-impl/src/main/java/com/powsybl/iidm/network/impl/TemporaryLimitNestedAdderImpl.java b/iidm/iidm-impl/src/main/java/com/powsybl/iidm/network/impl/TemporaryLimitNestedAdderImpl.java new file mode 100644 index 00000000000..af3bcd83563 --- /dev/null +++ b/iidm/iidm-impl/src/main/java/com/powsybl/iidm/network/impl/TemporaryLimitNestedAdderImpl.java @@ -0,0 +1,38 @@ +package com.powsybl.iidm.network.impl; + +import com.powsybl.iidm.network.AdderUser; +import com.powsybl.iidm.network.CurrentLimitsAdder; +import com.powsybl.iidm.network.LoadingLimitsAdder; +import com.powsybl.iidm.network.TemporaryLimitNestedAdder; + +public class TemporaryLimitNestedAdderImpl>> + implements TemporaryLimitNestedAdder { + private String name; + private ParentAdder parentAdder; + + public TemporaryLimitNestedAdderImpl(ParentAdder parentAdder) { + this.parentAdder = parentAdder; + } + + @Override + public ParentAdder end() { + parentAdder.collectAdder(this); + return parentAdder; + } + + @Override + public TemporaryLimitNestedAdder setName(String name) { + this.name = name; + return (TemporaryLimitNestedAdder) this; + } + + @Override + public String getName() { + return name; + } + + @Override + public LoadingLimitsAdder.TemporaryLimitAdder fill(LoadingLimitsAdder.TemporaryLimitAdder adder) { + return adder.setName(name); + } +} diff --git a/iidm/iidm-impl/src/test/java/com/powsybl/iidm/network/impl/tck/NetworkTest.java b/iidm/iidm-impl/src/test/java/com/powsybl/iidm/network/impl/tck/NetworkTest.java index 92951503664..50dbd2a7364 100644 --- a/iidm/iidm-impl/src/test/java/com/powsybl/iidm/network/impl/tck/NetworkTest.java +++ b/iidm/iidm-impl/src/test/java/com/powsybl/iidm/network/impl/tck/NetworkTest.java @@ -169,4 +169,50 @@ void shouldReuseInfoWhenCreatingLineFromTemplateMixedView() { assertEquals(2, newLine.getTerminal1().getNodeBreakerView().getNode()); assertEquals("bus2", newLine.getTerminal2().getBusBreakerView().getBus().getId()); } + + @Test + void canCreateNestedCurrentLimitUsingLineAdder() { + Network network = Network.create("test", "test"); + VoltageLevel vl1 = network.newVoltageLevel() + .setId("vl1") + .setTopologyKind(BUS_BREAKER) + .setName("name") + .setNominalV(225) + .setLowVoltageLimit(200) + .setHighVoltageLimit(250) + .add(); + vl1.getBusBreakerView().newBus().setId("bus1").add(); + VoltageLevel vl2 = network.newVoltageLevel() + .setId("vl2") + .setTopologyKind(BUS_BREAKER) + .setName("name") + .setNominalV(225) + .setLowVoltageLimit(200) + .setHighVoltageLimit(250) + .add(); + vl2.getBusBreakerView().newBus().setId("bus2").add(); + try { + network.newLine() + .setId("existingLine") + .setName("name") + .setR(12) + .setX(24) + .setG1(100) + .setB1(10) + .setG2(200) + .setB2(20) + .setBus1("bus1") + .setBus2("bus2") + .beginCurrentLimits() + .setPermanentLimit(4) + .beginTemporaryLimit() + .setName("tutu") + .end() + .end() + .add(); + } catch (Exception e) { + System.out.println(e); + // adders will throw because they are not completely implemented + } + } }