Ticket #22504: 0003-Add-circularize-selected-ways-code.patch

File 0003-Add-circularize-selected-ways-code.patch, 3.0 KB (added by qeef, 2 years ago)
  • src/org/openstreetmap/josm/actions/AlignInCircleAction.java

    From 3a51e7887980686da10104b67495b2b18c7e95d6 Mon Sep 17 00:00:00 2001
    From: Jiri Vlasak <jiri.hubacek@gmail.com>
    Date: Mon, 14 Nov 2022 21:36:59 +0100
    Subject: [PATCH 3/3] Add circularize selected ways code
    
    ---
     .../josm/actions/AlignInCircleAction.java     | 43 +++++++++++++++++++
     1 file changed, 43 insertions(+)
    
    diff --git a/src/org/openstreetmap/josm/actions/AlignInCircleAction.java b/src/org/openstreetmap/josm/actions/AlignInCircleAction.java
    index ee03219f7c..5b285bc651 100644
    a b public final class AlignInCircleAction extends JosmAction {  
    149149     * <p>
    150150     * Case 3: Only nodes are selected
    151151     * --&gt; Align these nodes, all are fix
     152     * <p>
     153     * Case 4: Circularize selected ways
     154     * --&gt; Circularize each way of the selection.
    152155     * @param ds data set in which the command operates
    153156     * @return the resulting command to execute to perform action, or null if nothing was changed
    154157     * @throws InvalidSelection if selection cannot be used
    public final class AlignInCircleAction extends JosmAction {  
    226229            }
    227230            fixNodes.addAll(onWay);
    228231            nodes = collectNodesAnticlockwise(ways);
     232        } else if (!ways.isEmpty() && selectedNodes.isEmpty()) {
     233            center = null;
     234            radius = 0;
     235            List<Command> rcmds = new LinkedList<>();
     236            for (Way w : ways) {
     237                if (!w.isDeleted() && w.isArea()) {
     238                    List<Node> wnodes = w.getNodes();
     239                    wnodes.remove(wnodes.size() - 1);
     240                    if (validateGeometry(wnodes)) {
     241                        center = Geometry.getCenter(wnodes);
     242                    }
     243                    if (center == null) {
     244                        continue;
     245                    }
     246                    boolean skipThisWay = false;
     247                    radius = 0;
     248                    for (Node n : wnodes) {
     249                        if (!n.isLatLonKnown()) {
     250                            skipThisWay = true;
     251                            break;
     252                        } else {
     253                            radius += center.distance(n.getEastNorth());
     254                        }
     255                    }
     256                    if (skipThisWay) {
     257                        continue;
     258                    } else {
     259                        radius /= wnodes.size();
     260                    }
     261                    Command c = moveNodesCommand(
     262                            wnodes, new HashSet<Node>(), center, radius);
     263                    if (c != null) {
     264                        rcmds.add(c);
     265                    }
     266                }
     267            }
     268            if (rcmds.isEmpty()) {
     269                throw new InvalidSelection();
     270            }
     271            return new SequenceCommand(tr("Align each Way in Circle"), rcmds);
    229272        } else {
    230273            throw new InvalidSelection();
    231274        }