Ticket #2024: mirror.patch

File mirror.patch, 4.1 KB (added by Daeron, 16 years ago)
  • src/org/openstreetmap/josm/actions/MirrorAction.java

     
     1// License: GPL. Copyright 2007 by Immanuel Scholz and others
     2package org.openstreetmap.josm.actions;
     3
     4import static org.openstreetmap.josm.tools.I18n.tr;
     5
     6import java.awt.event.ActionEvent;
     7import java.awt.event.KeyEvent;
     8import java.util.Collection;
     9import java.util.HashSet;
     10import java.util.LinkedList;
     11
     12import javax.swing.JOptionPane;
     13
     14import org.openstreetmap.josm.Main;
     15import org.openstreetmap.josm.command.Command;
     16import org.openstreetmap.josm.command.ChangeCommand;
     17import org.openstreetmap.josm.command.MoveCommand;
     18import org.openstreetmap.josm.command.SequenceCommand;
     19import org.openstreetmap.josm.data.coor.EastNorth;
     20import org.openstreetmap.josm.data.osm.Node;
     21import org.openstreetmap.josm.data.osm.OsmPrimitive;
     22import org.openstreetmap.josm.data.osm.Way;
     23import org.openstreetmap.josm.tools.Shortcut;
     24
     25/**
     26 * Mirror the selected nodes or ways along the vertical axis
     27 *
     28 * Note: If a ways are selected, their nodes are mirrored
     29 *
     30 * @author Teemu Koskinen, based on much copy&Paste from other Actions.
     31 */
     32public final class MirrorAction extends JosmAction {
     33
     34    public MirrorAction() {
     35        super(tr("Mirror"), "mirror", tr("Mirror selected nodes and ways."),
     36        Shortcut.registerShortcut("tools:mirror", tr("Tool: {0}", tr("Mirror")),
     37            KeyEvent.VK_M, Shortcut.GROUP_EDIT, Shortcut.SHIFT_DEFAULT), true);
     38    }
     39
     40    public void actionPerformed(ActionEvent e) {
     41        Collection<OsmPrimitive> sel = Main.ds.getSelected();
     42        HashSet<Node> nodes = new HashSet<Node>();
     43
     44        for (OsmPrimitive osm : sel) {
     45            if (osm instanceof Node) {
     46                nodes.add((Node)osm);
     47            } else if (osm instanceof Way) {
     48                nodes.addAll(((Way)osm).nodes);
     49            }
     50        }
     51
     52        if (nodes.size() == 0) {
     53            JOptionPane.showMessageDialog(Main.parent, tr("Please select at least one node or way."));
     54            return;
     55        }
     56
     57        double minEast = 200.0;
     58        double maxEast = -200.0;
     59        for (Node n : nodes) {
     60            minEast = Math.min(minEast, n.eastNorth.east());
     61            maxEast = Math.max(maxEast, n.eastNorth.east());
     62        }
     63        double middle = (minEast + maxEast) / 2;
     64
     65        Collection<Command> cmds = new LinkedList<Command>();
     66
     67        for (Node n : nodes)
     68            cmds.add(new MoveCommand(n, 2 * (middle - n.eastNorth.east()), 0.0));
     69
     70        Main.main.undoRedo.add(new SequenceCommand(tr("Mirror"), cmds));
     71        Main.map.repaint();
     72    }
     73}
  • src/org/openstreetmap/josm/gui/MainMenu.java

     
    4141import org.openstreetmap.josm.actions.JoinNodeWayAction;
    4242import org.openstreetmap.josm.actions.JosmAction;
    4343import org.openstreetmap.josm.actions.MergeNodesAction;
     44import org.openstreetmap.josm.actions.MirrorAction;
    4445import org.openstreetmap.josm.actions.NewAction;
    4546import org.openstreetmap.josm.actions.OpenFileAction;
    4647import org.openstreetmap.josm.actions.OpenLocationAction;
     
    120121    public final JosmAction alignInLine = new AlignInLineAction();
    121122    public final JosmAction distribute = new DistributeAction();
    122123    public final JosmAction ortho = new OrthogonalizeAction();
     124    public final JosmAction mirror = new MirrorAction();
    123125    public final AddNodeAction addnode = new AddNodeAction();
    124126    public final JosmAction createCircle = new CreateCircleAction();
    125127    public final JosmAction mergeNodes = new MergeNodesAction();
     
    269271        add(toolsMenu, alignInLine);
    270272        add(toolsMenu, distribute);
    271273        add(toolsMenu, ortho);
     274        add(toolsMenu, mirror);
    272275        toolsMenu.addSeparator();
    273276        add(toolsMenu, addnode);
    274277        add(toolsMenu, createCircle);