|
| 1 | +// SPDX-FileCopyrightText: 2021 Alliander N.V. |
| 2 | +// |
| 3 | +// SPDX-License-Identifier: Apache-2.0 |
| 4 | +package org.lfenergy.compas.scl.auto.alignment.builder; |
| 5 | + |
| 6 | +import com.powsybl.sld.model.*; |
| 7 | +import org.lfenergy.compas.scl.auto.alignment.exception.SclAutoAlignmentException; |
| 8 | +import org.lfenergy.compas.scl.auto.alignment.model.*; |
| 9 | + |
| 10 | +import java.util.HashMap; |
| 11 | +import java.util.List; |
| 12 | +import java.util.Map; |
| 13 | + |
| 14 | +import static org.lfenergy.compas.scl.auto.alignment.exception.SclAutoAlignmentErrorCode.VOLTAGELEVEL_NOT_FOUND_ERROR_CODE; |
| 15 | + |
| 16 | +public class SubstationGraphBuilder extends AbstractGraphBuilder<SubstationGraph> { |
| 17 | + private final GenericSubstation substation; |
| 18 | + |
| 19 | + private final Map<String, VoltageLevelGraphBuilder> voltageLevelGraphBuilderMap = new HashMap<>(); |
| 20 | + |
| 21 | + public SubstationGraphBuilder(GenericSubstation substation) { |
| 22 | + this(substation, new HashMap<>()); |
| 23 | + } |
| 24 | + |
| 25 | + public SubstationGraphBuilder(GenericSubstation substation, |
| 26 | + Map<String, Node> path2Node) { |
| 27 | + super(path2Node); |
| 28 | + this.substation = substation; |
| 29 | + |
| 30 | + setGraph(SubstationGraph.create(substation.getFullName())); |
| 31 | + |
| 32 | + createSubstation(); |
| 33 | + } |
| 34 | + |
| 35 | + private void createSubstation() { |
| 36 | + substation.getVoltageLevels().forEach(this::createVoltageLevelGraph); |
| 37 | + substation.getPowerTransformers().forEach(this::createPowerTransformer); |
| 38 | + } |
| 39 | + |
| 40 | + private void createVoltageLevelGraph(GenericVoltageLevel voltageLevel) { |
| 41 | + var voltageLevelBuilder = new VoltageLevelGraphBuilder(voltageLevel, substation, getPath2Node()); |
| 42 | + getGraph().addVoltageLevel(voltageLevelBuilder.getGraph()); |
| 43 | + voltageLevelGraphBuilderMap.put(voltageLevel.getFullName(), voltageLevelBuilder); |
| 44 | + } |
| 45 | + |
| 46 | + private VoltageLevelGraphBuilder getVoltageLevelBuilder(GenericTransformerWinding transformerWinding) { |
| 47 | + var connectivityNode = transformerWinding.getTerminals().get(0).getConnectivityNode(); |
| 48 | + return substation.getVoltageLevels().stream() |
| 49 | + .map(GenericVoltageLevel::getBays) |
| 50 | + .flatMap(List::stream) |
| 51 | + .map(GenericBay::getConductingEquipments) |
| 52 | + .flatMap(List::stream) |
| 53 | + .map(GenericConductingEquipment::getTerminals) |
| 54 | + .flatMap(List::stream) |
| 55 | + .filter(terminal -> connectivityNode.equals(terminal.getConnectivityNode())) |
| 56 | + .findFirst() |
| 57 | + .map(terminal -> ((GenericConductingEquipment) terminal.getParent()).getParent().getParent()) |
| 58 | + .map(genericVoltageLevel -> voltageLevelGraphBuilderMap.get(genericVoltageLevel.getFullName())) |
| 59 | + .orElseThrow(() -> new SclAutoAlignmentException(VOLTAGELEVEL_NOT_FOUND_ERROR_CODE, "No voltage level found.")); |
| 60 | + } |
| 61 | + |
| 62 | + private void createPowerTransformer(GenericPowerTransformer powerTransformer) { |
| 63 | + if (powerTransformer.isFeeder2WT()) { |
| 64 | + var tws = powerTransformer.getTransformerWindings(); |
| 65 | + getGraph().addMultiTermNode( |
| 66 | + Middle2WTNode.create(powerTransformer.getFullName(), |
| 67 | + powerTransformer.getFullName(), |
| 68 | + getGraph(), |
| 69 | + getFeeder2WTLegNode(tws.get(0)), |
| 70 | + getFeeder2WTLegNode(tws.get(1)), |
| 71 | + getVoltageLevelBuilder(tws.get(0)).getGraph().getVoltageLevelInfos(), |
| 72 | + getVoltageLevelBuilder(tws.get(1)).getGraph().getVoltageLevelInfos(), |
| 73 | + false)); |
| 74 | + } else if (powerTransformer.isFeeder3WT()) { |
| 75 | + var tws = powerTransformer.getTransformerWindings(); |
| 76 | + getGraph().addMultiTermNode( |
| 77 | + Middle3WTNode.create(powerTransformer.getFullName(), |
| 78 | + powerTransformer.getFullName(), |
| 79 | + getGraph(), |
| 80 | + getFeeder3WTLegNode(tws.get(0)), |
| 81 | + getFeeder3WTLegNode(tws.get(1)), |
| 82 | + getFeeder3WTLegNode(tws.get(2)), |
| 83 | + getVoltageLevelBuilder(tws.get(0)).getGraph().getVoltageLevelInfos(), |
| 84 | + getVoltageLevelBuilder(tws.get(1)).getGraph().getVoltageLevelInfos(), |
| 85 | + getVoltageLevelBuilder(tws.get(2)).getGraph().getVoltageLevelInfos())); |
| 86 | + } |
| 87 | + } |
| 88 | + |
| 89 | + private Feeder2WTLegNode getFeeder2WTLegNode(GenericTransformerWinding transformerWinding) { |
| 90 | + var connectivityNode = transformerWinding.getTerminals().get(0).getConnectivityNode(); |
| 91 | + return (Feeder2WTLegNode) getNodeByPath(connectivityNode); |
| 92 | + } |
| 93 | + |
| 94 | + private Feeder3WTLegNode getFeeder3WTLegNode(GenericTransformerWinding transformerWinding) { |
| 95 | + var connectivityNode = transformerWinding.getTerminals().get(0).getConnectivityNode(); |
| 96 | + return (Feeder3WTLegNode) getNodeByPath(connectivityNode); |
| 97 | + } |
| 98 | +} |
0 commit comments