improve snap to grid when multiple joint points are selected

This commit is contained in:
bancika
2020-09-15 10:41:40 +02:00
parent 00769efb56
commit 59cc4084fc
@@ -279,7 +279,7 @@ public class Presenter implements IPlugInPort {
if (!isComponentLocked(component) && isComponentVisible(component) if (!isComponentLocked(component) && isComponentVisible(component)
&& !configManager.readBoolean(HIGHLIGHT_CONTINUITY_AREA, false)) { && !configManager.readBoolean(HIGHLIGHT_CONTINUITY_AREA, false)) {
ComponentArea area = drawingManager.getComponentArea(component); ComponentArea area = drawingManager.getComponentArea(component);
if (area != null && area.getOutlineArea() != null && area.getOutlineArea().contains(scaledPoint)) { if (area != null && area.getOutlineArea() != null && scaledPoint != null && area.getOutlineArea().contains(scaledPoint)) {
return Cursor.getPredefinedCursor(Cursor.HAND_CURSOR); return Cursor.getPredefinedCursor(Cursor.HAND_CURSOR);
} }
} }
@@ -1321,19 +1321,29 @@ public class Presenter implements IPlugInPort {
Dimension d = drawingManager.getCanvasDimensions(currentProject, 1d, useExtraSpace); Dimension d = drawingManager.getCanvasDimensions(currentProject, 1d, useExtraSpace);
double extraSpace = useExtraSpace ? drawingManager.getExtraSpace(currentProject) : 0; double extraSpace = useExtraSpace ? drawingManager.getExtraSpace(currentProject) : 0;
if (controlPointMap.size() == 1) { List<Point2D> points = new ArrayList<Point2D>();
Map.Entry<IDIYComponent<?>, Set<Integer>> entry = controlPointMap.entrySet().iterator().next(); for (Map.Entry<IDIYComponent<?>, Set<Integer>> entry : controlPointMap.entrySet()) {
for (Integer i : entry.getValue())
Point2D firstPoint = entry.getKey().getControlPoint(entry.getValue().toArray(new Integer[] {})[0]); {
Point2D testPoint = new Point2D.Double(firstPoint.getX() + dx, firstPoint.getY() + dy); Point2D p = entry.getKey().getControlPoint(i);
if (snapToGrid) { points.add(p);
CalcUtils.snapPointToGrid(testPoint, currentProject.getGridSpacing()); }
} else if (snapToObjects) {
CalcUtils.snapPointToObjects(testPoint, currentProject.getGridSpacing(), entry.getKey(), currentProject.getComponents());
} }
actualDx = testPoint.getX() - firstPoint.getX(); Point2D firstPoint = points.iterator().next();
actualDy = testPoint.getY() - firstPoint.getY(); if (points.size() == 1 || points.stream().allMatch((x) -> x.equals(firstPoint))) {
double avgX = points.stream().mapToDouble((x) -> x.getX()).average().getAsDouble();
double avgY = points.stream().mapToDouble((x) -> x.getY()).average().getAsDouble();
Point2D testPoint = new Point2D.Double(avgX + dx, avgY + dy);
if (snapToGrid) {
CalcUtils.snapPointToGrid(testPoint, currentProject.getGridSpacing());
} else if (snapToObjects && controlPointMap.size() == 1) {
CalcUtils.snapPointToObjects(testPoint, currentProject.getGridSpacing(), controlPointMap.entrySet().iterator().next().getKey(), currentProject.getComponents());
}
actualDx = testPoint.getX() - avgX;
actualDy = testPoint.getY() - avgY;
} else if (snapToGrid) { } else if (snapToGrid) {
actualDx = CalcUtils.roundToGrid(dx, currentProject.getGridSpacing()); actualDx = CalcUtils.roundToGrid(dx, currentProject.getGridSpacing());
actualDy = CalcUtils.roundToGrid(dy, currentProject.getGridSpacing()); actualDy = CalcUtils.roundToGrid(dy, currentProject.getGridSpacing());