Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
98d2a6e
get all voltage level connections
EtienneLt Aug 21, 2025
397e97c
Merge branch 'main' into get-all-voltage-levels-connections
EtienneLt Aug 21, 2025
884a664
fix
EtienneLt Aug 21, 2025
732185b
refactor
EtienneLt Aug 22, 2025
46700f8
refactor everything
EtienneLt Aug 22, 2025
6b9b5a4
fix
EtienneLt Aug 22, 2025
6d0e15e
fix
EtienneLt Aug 22, 2025
01cbb74
fix
EtienneLt Aug 27, 2025
80a13c0
Merge branch 'main' into get-all-voltage-levels-connections
EtienneLt Aug 27, 2025
7774634
fix
EtienneLt Aug 27, 2025
0305db9
remove error from merge
EtienneLt Aug 27, 2025
84cff31
checkstyle
EtienneLt Aug 27, 2025
a971d0c
Merge branch 'main' into get-all-voltage-levels-connections
EtienneLt Sep 3, 2025
1e5770b
add tests
EtienneLt Sep 3, 2025
f63c963
add side for branches
EtienneLt Sep 5, 2025
7e6fd6b
add side
ghazwarhili Sep 5, 2025
c966b59
rename side to connectionSide
ghazwarhili Sep 7, 2025
c2a535e
fix naming
ghazwarhili Sep 7, 2025
12d9d9f
renaming
ghazwarhili Sep 8, 2025
fed0ec8
fix for BusbarSectionFinderTraverser
ghazwarhili Sep 14, 2025
c112b6a
enhance BusbarSectionFinderTraverser to handle all cases
ghazwarhili Sep 15, 2025
34b31cc
code review remarks part 1
ghazwarhili Sep 19, 2025
5a615ba
code review remarks part 2
ghazwarhili Sep 19, 2025
8163bb1
resolving conflicts
ghazwarhili Sep 21, 2025
8bcf99a
Merge branch 'fix-busbar-section-finder-traverser' into get-all-volta…
ghazwarhili Sep 22, 2025
fff52f6
Etienne H Request to use FeederSide
ghazwarhili Sep 24, 2025
c40fe02
resolving conflicts and revert BusbarSectionFinderTraverser
ghazwarhili Sep 24, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@
/**
* 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.network.map.dto.definition.extension;

import com.fasterxml.jackson.annotation.JsonInclude;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
/**
* Copyright (c) 2025, 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.network.map.dto.definition.voltagelevel;

import com.powsybl.iidm.network.TwoSides;
import org.gridsuite.network.map.dto.definition.extension.ConnectablePositionInfos;

/**
* @author Etienne Lesot <etienne.lesot at rte-france.com>
*/
public record FeederBayInfos(String busbarSectionId, ConnectablePositionInfos connectablePositionInfos, TwoSides connectionSide) { }
Original file line number Diff line number Diff line change
Expand Up @@ -59,4 +59,7 @@ public class VoltageLevelFormInfos extends ElementInfosWithProperties {

@JsonInclude(JsonInclude.Include.NON_NULL)
private Map<String, List<String>> busBarSectionInfos;

@JsonInclude(JsonInclude.Include.NON_NULL)
private Map<String, List<FeederBayInfos>> feederBaysInfos;
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
import org.gridsuite.network.map.dto.ElementInfos;
import org.gridsuite.network.map.dto.InfoTypeParameters;
import org.gridsuite.network.map.dto.definition.busbarsection.BusBarSectionFormInfos;
import org.gridsuite.network.map.dto.definition.voltagelevel.FeederBayInfos;
import org.gridsuite.network.map.dto.definition.voltagelevel.VoltageLevelFormInfos;
import org.gridsuite.network.map.dto.definition.voltagelevel.VoltageLevelMapInfos;
import org.gridsuite.network.map.dto.definition.voltagelevel.VoltageLevelTabInfos;
Expand All @@ -23,6 +24,7 @@
import java.util.*;
import java.util.stream.Collectors;

import static com.powsybl.iidm.network.Terminal.getConnectableSide;
import static org.gridsuite.network.map.dto.utils.ElementUtils.*;

/**
Expand Down Expand Up @@ -106,14 +108,37 @@ static VoltageLevelFormInfos toFormInfos(Identifiable<?> identifiable) {
builder.isRetrievedBusbarSections(vlTopologyInfos.isRetrievedBusbarSections());
builder.isBusbarSectionPositionFound(vlTopologyInfos.isBusbarSectionPositionFound());
builder.busBarSectionInfos(vlTopologyInfos.getBusBarSectionInfosGrouped());
builder.feederBaysInfos(getFeederBaysInfos(voltageLevel));
}

builder.identifiableShortCircuit(ExtensionUtils.toIdentifiableShortCircuit(voltageLevel));

return builder.build();
}

static VoltageLevelMapInfos toMapInfos(Identifiable<?> identifiable) {
private static Map<String, List<FeederBayInfos>> getFeederBaysInfos(VoltageLevel voltageLevel) {
Map<String, List<FeederBayInfos>> feederBayInfos = new HashMap<>();
String currentVoltageLevelId = voltageLevel.getId();
voltageLevel.getConnectableStream()
.filter(connectable -> !(connectable instanceof BusbarSection))
.forEach(connectable -> {
List<FeederBayInfos> connections = new ArrayList<>();
for (Object obj : connectable.getTerminals()) {
Terminal terminal = (Terminal) obj;
if (terminal.getVoltageLevel().getId().equals(currentVoltageLevelId)) {
connections.add(new FeederBayInfos(
getBusOrBusbarSection(terminal),
getConnectablePosition(connectable, FeederSide.from(getConnectableSide(terminal))),
Objects.requireNonNull(getConnectableSide(terminal).orElse(null)).toTwoSides()
));
}
}
feederBayInfos.put(connectable.getId(), connections);
});
return feederBayInfos;
}

protected static VoltageLevelMapInfos toMapInfos(Identifiable<?> identifiable) {
VoltageLevel voltageLevel = (VoltageLevel) identifiable;
return VoltageLevelMapInfos.builder()
.id(voltageLevel.getId())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,14 @@
package org.gridsuite.network.map.dto.utils;

import com.powsybl.iidm.network.*;
import com.powsybl.iidm.network.extensions.ConnectablePosition;
import com.powsybl.math.graph.TraversalType;
import lombok.NonNull;
import org.gridsuite.network.map.dto.common.ReactiveCapabilityCurveMapData;
import org.gridsuite.network.map.dto.common.TapChangerData;
import org.gridsuite.network.map.dto.common.TapChangerStepData;
import org.gridsuite.network.map.dto.definition.extension.BusbarSectionFinderTraverser;
import org.springframework.lang.NonNull;
import org.gridsuite.network.map.dto.definition.extension.ConnectablePositionInfos;

import java.util.Collection;
import java.util.List;
Expand All @@ -39,6 +41,53 @@ public static void setIfNotNan(@NonNull final DoubleConsumer setter, final doubl
}
}

public enum FeederSide {
INJECTION_SINGLE_SIDE,
BRANCH_SIDE_ONE,
BRANCH_SIDE_TWO;

public static FeederSide from(Optional<ThreeSides> connectableSide) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

public static FeederSide from(Optional<ThreeSides> connectableSide) {
            if (connectableSide.isEmpty()) {
                return INJECTION_SINGLE_SIDE;
            }
            return connectableSide.get() == ThreeSides.ONE ? BRANCH_SIDE_ONE : BRANCH_SIDE_TWO;
}

ThreeSides threeSides = connectableSide.orElse(null);
if (threeSides == null) {
return INJECTION_SINGLE_SIDE;
}
return threeSides == ThreeSides.ONE ? BRANCH_SIDE_ONE : BRANCH_SIDE_TWO;
}
}

private static ConnectablePosition.Feeder getFeederInfos(Identifiable<?> identifiable, FeederSide side) {
var connectablePosition = identifiable.getExtension(ConnectablePosition.class);
if (connectablePosition == null) {
return null;
}

switch (side) {
case INJECTION_SINGLE_SIDE:
return connectablePosition.getFeeder();
case BRANCH_SIDE_ONE:
return connectablePosition.getFeeder1();
case BRANCH_SIDE_TWO:
return connectablePosition.getFeeder2();
default:
throw new IllegalArgumentException("Invalid feeder side: " + side);
}
}

public static ConnectablePositionInfos getConnectablePosition(Identifiable<?> identifiable, FeederSide side) {
ConnectablePosition.Feeder feeder = getFeederInfos(identifiable, side);
return buildConnectablePositionInfos(feeder);
}

public static ConnectablePositionInfos buildConnectablePositionInfos(ConnectablePosition.Feeder feeder) {
ConnectablePositionInfos.ConnectablePositionInfosBuilder builder = ConnectablePositionInfos.builder();
if (feeder != null) {
builder.connectionDirection(feeder.getDirection() == null ? null : feeder.getDirection())
.connectionPosition(feeder.getOrder().orElse(null))
.connectionName(feeder.getName().orElse(null));
}
return builder.build();
}

public static String getBusOrBusbarSection(Terminal terminal) {
if (terminal.getVoltageLevel().getTopologyKind().equals(TopologyKind.BUS_BREAKER)) {
if (terminal.isConnected()) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ public static ConnectablePositionInfos toMapConnectablePosition(@NonNull final I
case 0 -> connectablePosition.getFeeder();
case 1 -> connectablePosition.getFeeder1();
case 2 -> connectablePosition.getFeeder2();
case 3 -> connectablePosition.getFeeder3();
default -> throw new IllegalArgumentException("Invalid feeder index: " + index);
})
.ifPresent(feeder -> builder
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1158,6 +1158,48 @@ void setUp() {
.withDirection(ConnectablePosition.Direction.TOP).add()
.add();

// add line between vlgen4 et vlgen 5 for feederBays Infos
VoltageLevel vlgen7 = p5.newVoltageLevel()
.setId("VLGEN7")
.setNominalV(24.0)
.setHighVoltageLimit(30)
.setLowVoltageLimit(20)
.setTopologyKind(TopologyKind.NODE_BREAKER)
.add();
vlgen7.getNodeBreakerView().newBusbarSection()
.setId("NGEN7")
.setName("NGEN7")
.setNode(0)
.add();
createSwitch(vlgen4, "b4", SwitchKind.DISCONNECTOR, false, 0, 10);
createSwitch(vlgen4, "br11", SwitchKind.BREAKER, false, 10, 11);
createSwitch(vlgen7, "b5", SwitchKind.DISCONNECTOR, false, 0, 1);
createSwitch(vlgen7, "br21", SwitchKind.BREAKER, false, 1, 2);
network.newLine()
.setId("LINE7")
.setVoltageLevel1("VLGEN4")
.setNode1(11)
.setVoltageLevel2("VLGEN7")
.setNode2(2)
.setR(3.0)
.setX(33.0)
.setG1(0.0)
.setB1(386E-6 / 2)
.setG2(0.0)
.setB2(386E-6 / 2)
.add();
Line line7 = network.getLine("LINE7");
line7.newExtension(ConnectablePositionAdder.class)
.newFeeder1()
.withName("LINE7_Side_VLGEN4")
.withOrder(5)
.withDirection(ConnectablePosition.Direction.BOTTOM).add()
.newFeeder2()
.withName("LINE7_Side_VLGEN8")
.withOrder(3)
.withDirection(ConnectablePosition.Direction.TOP).add()
.add();

// Add new variant
network.getVariantManager().cloneVariant(VariantManagerConstants.INITIAL_VARIANT_ID, VARIANT_ID);
network.getVariantManager().setWorkingVariant(VARIANT_ID);
Expand Down Expand Up @@ -1725,10 +1767,10 @@ void shouldReturnLinesOperatingStatusData() throws Exception {

@Test
void shouldReturnLinesIds() throws Exception {
succeedingTestForElementsIds(NETWORK_UUID, null, List.of("NHV1_NHV2_1", "NHV1_NHV2_2", "LINE3", "LINE4").toString(), ElementType.LINE, null, null);
succeedingTestForElementsIds(NETWORK_UUID, null, List.of("NHV1_NHV2_1", "NHV1_NHV2_2", "LINE3", "LINE4").toString(), ElementType.LINE, null, List.of(24.0, 380.0));
succeedingTestForElementsIds(NETWORK_UUID, VARIANT_ID, List.of("NHV1_NHV2_1", "NHV1_NHV2_2", "LINE3", "LINE4").toString(), ElementType.LINE, null, null);
succeedingTestForElementsIds(NETWORK_UUID, VARIANT_ID, List.of("NHV1_NHV2_1", "NHV1_NHV2_2", "LINE3", "LINE4").toString(), ElementType.LINE, null, List.of(24.0, 380.0));
succeedingTestForElementsIds(NETWORK_UUID, null, List.of("NHV1_NHV2_1", "NHV1_NHV2_2", "LINE3", "LINE4", "LINE7").toString(), ElementType.LINE, null, null);
succeedingTestForElementsIds(NETWORK_UUID, null, List.of("NHV1_NHV2_1", "NHV1_NHV2_2", "LINE3", "LINE4", "LINE7").toString(), ElementType.LINE, null, List.of(24.0, 380.0));
succeedingTestForElementsIds(NETWORK_UUID, VARIANT_ID, List.of("NHV1_NHV2_1", "NHV1_NHV2_2", "LINE3", "LINE4", "LINE7").toString(), ElementType.LINE, null, null);
succeedingTestForElementsIds(NETWORK_UUID, VARIANT_ID, List.of("NHV1_NHV2_1", "NHV1_NHV2_2", "LINE3", "LINE4", "LINE7").toString(), ElementType.LINE, null, List.of(24.0, 380.0));
succeedingTestForElementsIds(NETWORK_UUID, VARIANT_ID, List.of("NHV1_NHV2_1", "NHV1_NHV2_2", "LINE3").toString(), ElementType.LINE, List.of("P1"), null);
succeedingTestForElementsIds(NETWORK_UUID, VARIANT_ID, List.of("NHV1_NHV2_1", "NHV1_NHV2_2", "LINE3").toString(), ElementType.LINE, List.of("P1"), List.of(24.0, 380.0));
succeedingTestForElementsIds(NETWORK_UUID, VARIANT_ID, List.of().toString(), ElementType.LINE, List.of("P1"), List.of(225.0));
Expand Down Expand Up @@ -2247,12 +2289,12 @@ void shouldReturnVotlageLevelsMapData() throws Exception {

@Test
void shouldReturnVoltageLevelsIds() throws Exception {
succeedingTestForElementsIds(NETWORK_UUID, null, List.of("VL", "VLGEN", "VLHV1", "VLHV2", "VLLOAD", "VLNEW2", "VLGEN3", "VLGEN4", "VLGEN5", "VLGEN6").toString(), ElementType.VOLTAGE_LEVEL, null, null);
succeedingTestForElementsIds(NETWORK_UUID, null, List.of("VL", "VLGEN", "VLHV1", "VLHV2", "VLLOAD", "VLNEW2", "VLGEN3", "VLGEN4", "VLGEN5", "VLGEN6").toString(), ElementType.VOLTAGE_LEVEL, null, List.of(24.0, 150.0, 225.0, 380.0));
succeedingTestForElementsIds(NETWORK_UUID, VARIANT_ID, List.of("VL", "VLGEN", "VLHV1", "VLHV2", "VLLOAD", "VLNEW2", "VLGEN3", "VLGEN4", "VLGEN5", "VLGEN6").toString(), ElementType.VOLTAGE_LEVEL, null, null);
succeedingTestForElementsIds(NETWORK_UUID, VARIANT_ID, List.of("VL", "VLGEN", "VLHV1", "VLHV2", "VLLOAD", "VLNEW2", "VLGEN3", "VLGEN4", "VLGEN5", "VLGEN6").toString(), ElementType.VOLTAGE_LEVEL, null, List.of(24.0, 150.0, 225.0, 380.0));
succeedingTestForElementsIds(NETWORK_UUID, VARIANT_ID, List.of("VLGEN", "VLHV1", "VLHV2", "VLLOAD", "VLNEW2", "VLGEN3", "VLGEN4", "VLGEN5", "VLGEN6").toString(), ElementType.VOLTAGE_LEVEL, List.of("P1", "P2", "P3", "P4", "P5", "P6"), null);
succeedingTestForElementsIds(NETWORK_UUID, VARIANT_ID, List.of("VLGEN", "VLHV1", "VLHV2", "VLLOAD", "VLNEW2", "VLGEN3", "VLGEN4", "VLGEN5", "VLGEN6").toString(), ElementType.VOLTAGE_LEVEL, List.of("P1", "P2", "P3", "P4", "P5", "P6"), List.of(24.0, 150.0, 225.0, 380.0));
succeedingTestForElementsIds(NETWORK_UUID, null, List.of("VL", "VLGEN", "VLHV1", "VLHV2", "VLLOAD", "VLNEW2", "VLGEN3", "VLGEN4", "VLGEN5", "VLGEN6", "VLGEN7").toString(), ElementType.VOLTAGE_LEVEL, null, null);
succeedingTestForElementsIds(NETWORK_UUID, null, List.of("VL", "VLGEN", "VLHV1", "VLHV2", "VLLOAD", "VLNEW2", "VLGEN3", "VLGEN4", "VLGEN5", "VLGEN6", "VLGEN7").toString(), ElementType.VOLTAGE_LEVEL, null, List.of(24.0, 150.0, 225.0, 380.0));
succeedingTestForElementsIds(NETWORK_UUID, VARIANT_ID, List.of("VL", "VLGEN", "VLHV1", "VLHV2", "VLLOAD", "VLNEW2", "VLGEN3", "VLGEN4", "VLGEN5", "VLGEN6", "VLGEN7").toString(), ElementType.VOLTAGE_LEVEL, null, null);
succeedingTestForElementsIds(NETWORK_UUID, VARIANT_ID, List.of("VL", "VLGEN", "VLHV1", "VLHV2", "VLLOAD", "VLNEW2", "VLGEN3", "VLGEN4", "VLGEN5", "VLGEN6", "VLGEN7").toString(), ElementType.VOLTAGE_LEVEL, null, List.of(24.0, 150.0, 225.0, 380.0));
succeedingTestForElementsIds(NETWORK_UUID, VARIANT_ID, List.of("VLGEN", "VLHV1", "VLHV2", "VLLOAD", "VLNEW2", "VLGEN3", "VLGEN4", "VLGEN5", "VLGEN6", "VLGEN7").toString(), ElementType.VOLTAGE_LEVEL, List.of("P1", "P2", "P3", "P4", "P5", "P6"), null);
succeedingTestForElementsIds(NETWORK_UUID, VARIANT_ID, List.of("VLGEN", "VLHV1", "VLHV2", "VLLOAD", "VLNEW2", "VLGEN3", "VLGEN4", "VLGEN5", "VLGEN6", "VLGEN7").toString(), ElementType.VOLTAGE_LEVEL, List.of("P1", "P2", "P3", "P4", "P5", "P6"), List.of(24.0, 150.0, 225.0, 380.0));
}

@Test
Expand All @@ -2270,11 +2312,16 @@ void shouldReturnNotFoundInsteadOfVoltageLevelsMapData() throws Exception {
}

@Test
void shouldReturnVotlageLevelFormData() throws Exception {
void shouldReturnVoltageLevelFormData() throws Exception {
succeedingTestForElementInfosWithElementId(NETWORK_UUID, null, ElementType.VOLTAGE_LEVEL, InfoType.FORM, "VLGEN4", resourceToString("/voltage-level-form-data.json"));
succeedingTestForElementInfosWithElementId(NETWORK_UUID, VARIANT_ID, ElementType.VOLTAGE_LEVEL, InfoType.FORM, "VLGEN4", resourceToString("/voltage-level-form-data.json"));
}

@Test
void shouldReturnVoltageLevelFormDataWithFeederBaysInfos() throws Exception {
succeedingTestForElementInfosWithElementId(NETWORK_UUID, null, ElementType.VOLTAGE_LEVEL, InfoType.FORM, "VLGEN5", resourceToString("/voltage-level-form-data-feederbays.json"));
}

@Test
void shouldReturnVotlageLevelNonSymmetricalBusbarsFormData() throws Exception {
succeedingTestForElementInfosWithElementId(NETWORK_UUID, null, ElementType.VOLTAGE_LEVEL, InfoType.FORM, "VLGEN5", resourceToString("/voltage-level-non-symmetrical-busbars-form-data.json"));
Expand Down
77 changes: 77 additions & 0 deletions src/test/resources/all-data-in-variant.json
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,14 @@
{
"id": "P5",
"voltageLevels": [
{
"id": "VLGEN7",
"substationId": "P5",
"nominalV": 24.0,
"country": "FR",
"lowVoltageLimit": 20.0,
"highVoltageLimit": 30.0
},
{
"id": "VLGEN5",
"substationId": "P5",
Expand Down Expand Up @@ -219,6 +227,14 @@
"ipMin": 0.0,
"ipMax": 100.0
}
},
{
"id": "VLGEN7",
"substationId": "P5",
"nominalV": 24.0,
"country": "FR",
"lowVoltageLimit": 20.0,
"highVoltageLimit": 30.0
}
],
"lines": [
Expand Down Expand Up @@ -588,6 +604,26 @@
"b1": 1.93E-4,
"g2": 0.0,
"b2": 1.93E-4
},
{
"id": "LINE7",
"type": "LINE",
"voltageLevelId1": "VLGEN4",
"voltageLevelId2": "VLGEN7",
"nominalVoltage1": 24.0,
"nominalVoltage2": 24.0,
"substationId1": "P4",
"substationId2": "P5",
"country1": "FR",
"country2": "FR",
"terminal1Connected": true,
"terminal2Connected": true,
"r": 3.0,
"x": 33.0,
"g1": 0.0,
"b1": 1.93E-4,
"g2": 0.0,
"b2": 1.93E-4
}
],
"hvdcLines": [
Expand Down Expand Up @@ -2480,6 +2516,26 @@
"voltageLevelId": "VLGEN6",
"nominalVoltage": 24.0,
"country": "FR"
},
{
"id": "VLGEN4_0",
"v": "NaN",
"angle": "NaN",
"synchronousComponentNum": 1,
"connectedComponentNum": 1,
"voltageLevelId": "VLGEN4",
"nominalVoltage": 24.0,
"country": "FR"
},
{
"id": "VLGEN7_0",
"v": "NaN",
"angle": "NaN",
"synchronousComponentNum": 1,
"connectedComponentNum": 1,
"voltageLevelId": "VLGEN7",
"nominalVoltage": 24.0,
"country": "FR"
}
],
"busbarSections": [
Expand Down Expand Up @@ -2510,6 +2566,11 @@
"id": "NGEN5_2_2",
"name": "NGEN5_2_2",
"voltageLevelId": "VLGEN5"
},
{
"id": "NGEN7",
"name": "NGEN7",
"voltageLevelId": "VLGEN7"
}
],
"branches": [
Expand Down Expand Up @@ -2864,6 +2925,22 @@
"Country": "FR"
}
},
{
"id": "LINE7",
"type": "LINE",
"voltageLevelId1": "VLGEN4",
"voltageLevelId2": "VLGEN7",
"nominalVoltage1": 24.0,
"nominalVoltage2": 24.0,
"substationId1": "P4",
"substationId2": "P5",
"country1": "FR",
"country2": "FR",
"terminal1Connected": true,
"terminal2Connected": true,
"r": 3.0,
"x": 33.0
},
{
"id": "NGEN_NHV1",
"type": "TWO_WINDINGS_TRANSFORMER",
Expand Down
Loading
Loading