Ticket #2024: mirror.patch

File mirror.patch, 4.1 KB (added by Daeron, 3 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);