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
}
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;
}
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;
}
}
Aggregations