BSClusterSide.java

/**
 * Copyright (c) 2019, 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 com.powsybl.sld.layout.position.clustering;

import com.powsybl.sld.layout.position.BSCluster;
import com.powsybl.sld.layout.position.HorizontalBusList;
import com.powsybl.sld.layout.position.VerticalBusSet;
import com.powsybl.sld.model.cells.ExternCell;
import com.powsybl.sld.model.cells.InternCell;
import com.powsybl.sld.model.coordinate.Side;
import com.powsybl.sld.model.nodes.BusNode;

import java.util.*;
import java.util.stream.Collectors;

/**
 * BSClusterSide is the composition of a BSCluster and a Side (LEFT/RIGHT).
 *
 * @author Benoit Jeanson {@literal <benoit.jeanson at rte-france.com>}
 */
class BSClusterSide {

    private final BSCluster bsCluster;
    private final Side side;
    private BSClusterSide otherSameRoot;

    BSClusterSide(BSCluster bsCluster, Side side) {
        this.bsCluster = Objects.requireNonNull(bsCluster);
        this.side = Objects.requireNonNull(side);
    }

    void setOtherSameRoot(BSClusterSide otherSameRoot) {
        this.otherSameRoot = otherSameRoot;
    }

    Set<BusNode> getBusNodeSet() {
        return new LinkedHashSet<>(bsCluster.hblSideBuses(side));
    }

    List<InternCell> getCandidateFlatCellList() {
        return bsCluster.getSideCandidateFlatCell(side);
    }

    List<ExternCell> getExternCells() {
        return bsCluster.getVerticalBusSets().stream().flatMap(vbs -> vbs.getExternCells().stream()).collect(Collectors.toList());
    }

    int getExternCellAttractionToEdge(ExternCell cell) {
        List<VerticalBusSet> vbsList = bsCluster.getVerticalBusSets();
        return vbsList.stream().filter(vbs -> vbs.getExternCells().contains(cell)).findFirst()
                .map(vbs -> side == Side.LEFT ? (vbsList.size() - vbsList.indexOf(vbs))
                        : (vbsList.indexOf(vbs) + 1)).orElse(0);
    }

    List<InternCell> getInternCellsFromShape(InternCell.Shape shape) {
        return bsCluster.getInternCellsFromShape(shape);
    }

    BSCluster getCluster() {
        return bsCluster;
    }

    Side getMySideInCluster() {
        return side;
    }

    BSClusterSide getOtherSameRoot() {
        return otherSameRoot;
    }

    int getCandidateFlatCellDistanceToEdge(InternCell internCell) {
        List<BusNode> buses = internCell.getBusNodes();
        buses.retainAll(getBusNodeSet());
        if (buses.isEmpty()) {
            return 100;
        }
        BusNode busNode = buses.get(0); //shall have only one as used for a flatCell
        Optional<HorizontalBusList> horizontalBusList = bsCluster.getHorizontalBusLists()
                .stream()
                .filter(hbl -> side == Side.LEFT && hbl.getBusNodes().get(0) == busNode
                        || side == Side.RIGHT && hbl.getBusNodes().get(hbl.getBusNodes().size() - 1) == busNode)
                .findFirst();
        if (!horizontalBusList.isPresent()) {
            return 100;
        } else {
            if (side == Side.LEFT) {
                return horizontalBusList.get().getStartingIndex();
            } else {
                return bsCluster.getVerticalBusSets().size() - horizontalBusList.get().getEndingIndex();
            }
        }
    }

    @Override
    public String toString() {
        return side.toString() + " " + bsCluster.hblSideBuses(side).toString();
    }
}