Search in sources :

Example 1 with Geometry

use of org.eclipse.sirius.components.diagrams.layout.incremental.utils.Geometry in project sirius-components by eclipse-sirius.

the class IncrementalLayoutEngine method snapBorderNodes.

/**
 * Update the border node by snapping it to the parentRectangle, that is moving it to the closest point of the
 * parentRectangle.
 *
 * @param borderNodesLayoutData
 *            the border nodes which position is given in the rectangle upper right corner coordinates system
 * @return for each side of the given parentRectangle, the list of the updates border node
 */
private List<BorderNodesOnSide> snapBorderNodes(List<NodeLayoutData> borderNodesLayoutData, Size parentRectangle, ISiriusWebLayoutConfigurator layoutConfigurator) {
    EnumMap<RectangleSide, List<NodeLayoutData>> borderNodesPerSide = new EnumMap<>(RectangleSide.class);
    Geometry geometry = new Geometry();
    for (NodeLayoutData borderNodeLayoutData : borderNodesLayoutData) {
        double portOffset = layoutConfigurator.configureByType(borderNodeLayoutData.getNodeType()).getProperty(CoreOptions.PORT_BORDER_OFFSET).doubleValue();
        Bounds borderNodeRectangle = Bounds.newBounds().position(borderNodeLayoutData.getPosition()).size(borderNodeLayoutData.getSize()).build();
        PointOnRectangleInfo borderNodePositionOnSide = geometry.snapBorderNodeOnRectangle(borderNodeRectangle, parentRectangle, portOffset);
        // update the border node
        borderNodeLayoutData.setPosition(borderNodePositionOnSide.getPosition());
        borderNodesPerSide.computeIfAbsent(borderNodePositionOnSide.getSide(), side -> new ArrayList<>());
        borderNodesPerSide.get(borderNodePositionOnSide.getSide()).add(borderNodeLayoutData);
    }
    // @formatter:off
    return borderNodesPerSide.entrySet().stream().map(entry -> new BorderNodesOnSide(entry.getKey(), entry.getValue())).collect(Collectors.toList());
// @formatter:on
}
Also used : Geometry(org.eclipse.sirius.components.diagrams.layout.incremental.utils.Geometry) CoreOptions(org.eclipse.elk.core.options.CoreOptions) Size(org.eclipse.sirius.components.diagrams.Size) Ratio(org.eclipse.sirius.components.diagrams.Ratio) DiagramLayoutData(org.eclipse.sirius.components.diagrams.layout.incremental.data.DiagramLayoutData) Position(org.eclipse.sirius.components.diagrams.Position) NodeLabelPositionProvider(org.eclipse.sirius.components.diagrams.layout.incremental.provider.NodeLabelPositionProvider) NodeSizeProvider(org.eclipse.sirius.components.diagrams.layout.incremental.provider.NodeSizeProvider) ArrayList(java.util.ArrayList) EdgeRoutingPointsProvider(org.eclipse.sirius.components.diagrams.layout.incremental.provider.EdgeRoutingPointsProvider) Geometry(org.eclipse.sirius.components.diagrams.layout.incremental.utils.Geometry) BigDecimal(java.math.BigDecimal) NodePositionProvider(org.eclipse.sirius.components.diagrams.layout.incremental.provider.NodePositionProvider) Service(org.springframework.stereotype.Service) OverlapsUpdater(org.eclipse.sirius.components.diagrams.layout.incremental.updater.OverlapsUpdater) NodeLayoutData(org.eclipse.sirius.components.diagrams.layout.incremental.data.NodeLayoutData) Bounds(org.eclipse.sirius.components.diagrams.layout.incremental.utils.Bounds) RoundingMode(java.math.RoundingMode) EdgeLabelPositionProvider(org.eclipse.sirius.components.diagrams.layout.incremental.provider.EdgeLabelPositionProvider) IDiagramEvent(org.eclipse.sirius.components.diagrams.events.IDiagramEvent) ISiriusWebLayoutConfigurator(org.eclipse.sirius.components.diagrams.layout.ISiriusWebLayoutConfigurator) EnumMap(java.util.EnumMap) ResizeEvent(org.eclipse.sirius.components.diagrams.events.ResizeEvent) ContainmentUpdater(org.eclipse.sirius.components.diagrams.layout.incremental.updater.ContainmentUpdater) IContainerLayoutData(org.eclipse.sirius.components.diagrams.layout.incremental.data.IContainerLayoutData) Collectors(java.util.stream.Collectors) DoublePositionEvent(org.eclipse.sirius.components.diagrams.events.DoublePositionEvent) MoveEvent(org.eclipse.sirius.components.diagrams.events.MoveEvent) Objects(java.util.Objects) List(java.util.List) BorderNodeLabelPositionProvider(org.eclipse.sirius.components.diagrams.layout.incremental.provider.BorderNodeLabelPositionProvider) RectangleSide(org.eclipse.sirius.components.diagrams.layout.incremental.utils.RectangleSide) Optional(java.util.Optional) EdgeLayoutData(org.eclipse.sirius.components.diagrams.layout.incremental.data.EdgeLayoutData) PointOnRectangleInfo(org.eclipse.sirius.components.diagrams.layout.incremental.utils.PointOnRectangleInfo) Bounds(org.eclipse.sirius.components.diagrams.layout.incremental.utils.Bounds) PointOnRectangleInfo(org.eclipse.sirius.components.diagrams.layout.incremental.utils.PointOnRectangleInfo) ArrayList(java.util.ArrayList) List(java.util.List) EnumMap(java.util.EnumMap) RectangleSide(org.eclipse.sirius.components.diagrams.layout.incremental.utils.RectangleSide) NodeLayoutData(org.eclipse.sirius.components.diagrams.layout.incremental.data.NodeLayoutData)

Example 2 with Geometry

use of org.eclipse.sirius.components.diagrams.layout.incremental.utils.Geometry in project sirius-components by eclipse-sirius.

the class EdgeRoutingPointsProvider method getRoutingPoints.

public List<Position> getRoutingPoints(EdgeLayoutData edge) {
    List<Position> positions = List.of();
    if (edge.getSource().equals(edge.getTarget())) {
        positions = this.getRoutingPointsToMyself(edge.getSource().getPosition(), edge.getSource().getSize().getWidth());
    } else {
        Bounds sourceBounds = this.getAbsoluteBounds(edge.getSource());
        Bounds targetBounds = this.getAbsoluteBounds(edge.getTarget());
        this.supportOldDiagramWithExistingEdge(edge);
        Position sourceAbsolutePosition = this.toAbsolutePosition(edge.getSourceAnchorRelativePosition(), sourceBounds);
        Position targetAbsolutePosition = this.toAbsolutePosition(edge.getTargetAnchorRelativePosition(), targetBounds);
        Geometry geometry = new Geometry();
        Optional<Position> optionalSourceIntersection = geometry.getIntersection(targetAbsolutePosition, sourceAbsolutePosition, sourceBounds);
        Optional<Position> optionalTargetIntersection = geometry.getIntersection(sourceAbsolutePosition, targetAbsolutePosition, targetBounds);
        if (optionalSourceIntersection.isPresent() && optionalTargetIntersection.isPresent()) {
            positions = List.of(optionalSourceIntersection.get(), optionalTargetIntersection.get());
        }
    }
    return positions;
}
Also used : Geometry(org.eclipse.sirius.components.diagrams.layout.incremental.utils.Geometry) Position(org.eclipse.sirius.components.diagrams.Position) Bounds(org.eclipse.sirius.components.diagrams.layout.incremental.utils.Bounds)

Example 3 with Geometry

use of org.eclipse.sirius.components.diagrams.layout.incremental.utils.Geometry in project sirius-components by eclipse-sirius.

the class OverlapsUpdater method computeDistanceToBorder.

/**
 * Computes the shortest distance between the center1 point and the given node bounds intersection with the segment
 * (center1, center2).
 *
 * @param center1
 *            the first node center.
 * @param center2
 *            the second node center.
 * @param node
 *            the node used for computing the intersection.
 * @return the shortest distance.
 */
private double computeDistanceToBorder(Position center1, Position center2, NodeLayoutData node) {
    Geometry geometry = new Geometry();
    Optional<Position> optionalIntersection = geometry.getIntersection(center2, center1, this.getBounds(node));
    if (optionalIntersection.isPresent()) {
        return geometry.computeDistance(center1, optionalIntersection.get());
    } else {
        return 0;
    }
}
Also used : Geometry(org.eclipse.sirius.components.diagrams.layout.incremental.utils.Geometry) Position(org.eclipse.sirius.components.diagrams.Position)

Aggregations

Position (org.eclipse.sirius.components.diagrams.Position)3 Geometry (org.eclipse.sirius.components.diagrams.layout.incremental.utils.Geometry)3 Bounds (org.eclipse.sirius.components.diagrams.layout.incremental.utils.Bounds)2 BigDecimal (java.math.BigDecimal)1 RoundingMode (java.math.RoundingMode)1 ArrayList (java.util.ArrayList)1 EnumMap (java.util.EnumMap)1 List (java.util.List)1 Objects (java.util.Objects)1 Optional (java.util.Optional)1 Collectors (java.util.stream.Collectors)1 CoreOptions (org.eclipse.elk.core.options.CoreOptions)1 Ratio (org.eclipse.sirius.components.diagrams.Ratio)1 Size (org.eclipse.sirius.components.diagrams.Size)1 DoublePositionEvent (org.eclipse.sirius.components.diagrams.events.DoublePositionEvent)1 IDiagramEvent (org.eclipse.sirius.components.diagrams.events.IDiagramEvent)1 MoveEvent (org.eclipse.sirius.components.diagrams.events.MoveEvent)1 ResizeEvent (org.eclipse.sirius.components.diagrams.events.ResizeEvent)1 ISiriusWebLayoutConfigurator (org.eclipse.sirius.components.diagrams.layout.ISiriusWebLayoutConfigurator)1 DiagramLayoutData (org.eclipse.sirius.components.diagrams.layout.incremental.data.DiagramLayoutData)1